anonstream/anonstream/utils/websocket.py

53 行
1.6 KiB
Python
Raw 通常表示 履歴

2022-03-07 23:51:59 +09:00
# SPDX-FileCopyrightText: 2022 n9k [https://git.076.ne.jp/ninya9k]
# SPDX-License-Identifier: AGPL-3.0-or-later
from enum import Enum
WS = Enum('WS', names=('MESSAGE, CAPTCHA, APPEARANCE'))
class Malformed(Exception):
pass
def get(t, pairs, key, default=None):
value = pairs.get(key, default)
if isinstance(value, t):
return value
else:
raise Malformed(f'malformed {key}')
def parse_websocket_data(receipt):
if not isinstance(receipt, dict):
raise Malformed('not a json object')
match receipt.get('type'):
case 'message':
form = get(dict, receipt, 'form')
nonce = get(str, form, 'nonce')
comment = get(str, form, 'comment')
digest = get(str, form, 'captcha-digest', '')
answer = get(str, form, 'captcha-answer', '')
return WS.MESSAGE, (nonce, comment, digest, answer)
case 'appearance':
form = get(dict, receipt, 'form')
name = get(str, form, 'name').strip()
if len(name) == 0:
name = None
color = get(str, form, 'color')
password = get(str, form, 'password')
#match get(str | None, form, 'want-tripcode'):
# case '0':
# want_tripcode = False
# case '1':
# want_tripcode = True
# case _:
# want_tripcode = None
want_tripcode = bool(password)
return WS.APPEARANCE, (name, color, password, want_tripcode)
case 'captcha':
return WS.CAPTCHA, ()
case _:
raise Malformed('malformed type')