"""Prepare mail UI cases only in the isolated mail account/database.""" import json from pathlib import Path import sqlite3 import sys import time root = Path(__file__).resolve().parents[1] test_root = (root / 'Tools/output/g1-live').resolve() database = Path((test_root / 'mail-db.path').read_text(encoding='utf-8-sig').strip()).resolve() username = (test_root / 'mail-account.txt').read_text(encoding='utf-8-sig').strip() mode = sys.argv[1] if len(sys.argv) == 2 else '' if test_root not in database.parents or not username.startswith('g1live_mail_') or mode not in ('mixed', 'lost', 'empty', 'expired'): raise RuntimeError('Refusing non-isolated mail fixture') with sqlite3.connect(database) as conn: row = conn.execute('SELECT u.pid,g.state FROM users u JOIN game_states g ON g.pid=u.pid WHERE u.username=?', (username,)).fetchone() state = json.loads(row[1]) if state['schema'] != 7 or state.get('pendingShot') or state.get('pendingBattle'): raise RuntimeError('Finish isolated pending activities first') now = int(time.time()) def letter(i, reward=None, **flags): m = dict(mailId='fixture_' + str(i), title='营地来信 ' + str(i), body='伙伴们送来了问候。\n这是一封用于检查列表、附件和有效期的来信。', reward=dict(coins=0, candy=0, balls=0, tickets=0), sentAt=now-60, expiresAt=now+3600, read=False, claimed=False, expired=False) if reward: m['reward'].update(reward) m.update(flags) return m if mode == 'mixed': state['mails'] = [letter(0, dict(coins=7, balls=1, tickets=1)), letter(1, dict(balls=500), expiresAt=now-1), letter(2, dict(balls=500), read=True, claimed=True), letter(3), letter(4, dict(balls=2)), letter(5, dict(candy=20)), letter(6), letter(7)] state['mails'][5]['body'] = '伙伴来信\n' + ('这段正文可以上下滑动阅读。\n' * 30) elif mode == 'lost': state['mails'] = [letter('lost', dict(balls=5))] elif mode == 'expired': state['mails'] = [letter('expired', dict(balls=500), expiresAt=now-1)] else: state['mails'] = [] state['revision'] += 1 conn.execute('UPDATE game_states SET state=? WHERE pid=?', (json.dumps(state, ensure_ascii=False), row[0])) print('Prepared isolated mail UI case:', mode)