feat: Random.org dice and daily word matrix, interpreter voices, curated lexicon

Wire cleromancy rolls and the once-per-UTC-day 000-999 word shuffle to RANDOM.ORG JSON-RPC, with a local CSPRNG fallback. Add settings for interpreter personas and a cleaner default oracle prompt. Replace proper names and bureaucratic filler in the 1000-word lexicon with sacred symbols.
This commit is contained in:
2026-09-08 13:46:11 +05:00
parent fbf04d90db
commit 7f91366201
26 changed files with 8904 additions and 7077 deletions
+31 -8
View File
@@ -2,6 +2,7 @@ import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import '../models/history_entry_model.dart';
import '../models/word_model.dart';
import '../services/true_random_service.dart';
import '../services/words_repository.dart';
import '../widgets/cleromancy_dialog.dart';
import '../widgets/d10_dice_roller_widget.dart';
@@ -182,25 +183,47 @@ class _HomeSearchScreenState extends State<HomeSearchScreen> {
});
}
void _reshuffleMatrix() {
_repo.reshuffleSessionNumbers();
_resetSession();
Future<void> _reshuffleMatrix() async {
HapticFeedback.heavyImpact();
ScaffoldMessenger.of(context).showSnackBar(
SnackBar(
content: const Row(
const SnackBar(
content: Row(
children: [
GradientStar(size: 20),
SizedBox(width: 10),
Expanded(
child: Text(
'Случайный порядок 1000 чисел перетасован заново!',
'Запрашиваю суточную матрицу у RANDOM.ORG…',
style: TextStyle(fontWeight: FontWeight.w600),
),
),
],
),
duration: const Duration(seconds: 2),
duration: Duration(seconds: 2),
behavior: SnackBarBehavior.floating,
),
);
final source = await _repo.reshuffleSessionNumbers();
if (!mounted) return;
_resetSession();
final viaOrg = source == RandomSource.randomOrg;
ScaffoldMessenger.of(context).showSnackBar(
SnackBar(
content: Row(
children: [
const GradientStar(size: 20),
const SizedBox(width: 10),
Expanded(
child: Text(
viaOrg
? 'Матрица #000–#999 на сегодня задана RANDOM.ORG'
: 'RANDOM.ORG недоступен — матрица собрана локально',
style: const TextStyle(fontWeight: FontWeight.w600),
),
),
],
),
duration: const Duration(seconds: 3),
behavior: SnackBarBehavior.floating,
shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(12)),
),
@@ -242,7 +265,7 @@ class _HomeSearchScreenState extends State<HomeSearchScreen> {
onPressed: _resetSession,
),
IconButton(
tooltip: 'Перетасовать матрицу (#000..#999)',
tooltip: 'Новая суточная матрица через RANDOM.ORG',
icon: const Icon(Icons.shuffle_rounded),
onPressed: _reshuffleMatrix,
),