|
@@ -0,0 +1,70 @@
|
|
|
+import asyncio
|
|
|
+
|
|
|
+from pywebio import start_server
|
|
|
+from pywebio.input import *
|
|
|
+from pywebio.output import *
|
|
|
+from pywebio.session import run_async, run_js
|
|
|
+
|
|
|
+
|
|
|
+chat_msgs = []
|
|
|
+online_users = set()
|
|
|
+
|
|
|
+MAX_MSGS_COUNT = 100
|
|
|
+
|
|
|
+
|
|
|
+async def main():
|
|
|
+ global chat_msgs
|
|
|
+ put_markdown('## 😈 Всем доброго времени бытия!\nСегодня начнём за террористов, там посмотрим')
|
|
|
+ msg_box = output()
|
|
|
+ put_scrollable(msg_box, height=500, keep_bottom=True)
|
|
|
+ nickname = await input(
|
|
|
+ 'Зайти в базу', required=True, placeholder='Твой ник',
|
|
|
+ validate=lambda n: 'Эй балбес, ник норм придумай' if n in online_users or n == '🗣' else None
|
|
|
+ )
|
|
|
+ online_users.add(nickname)
|
|
|
+ chat_msgs.append(('🗣', f' `{nickname}` прибыл на базу!'))
|
|
|
+ msg_box.append(put_markdown(f' `{nickname}` прибыл на базу!'))
|
|
|
+ refresh_task = run_async(refresh_msg(nickname, msg_box))
|
|
|
+
|
|
|
+ while True:
|
|
|
+ data = await input_group(
|
|
|
+ '💭 Новое сообщение', [
|
|
|
+ input(placeholder='Текст сообщения', name='msg'),
|
|
|
+ actions(name='cmd', buttons=['Отправить', {'label': 'Выйти с базы', 'type': 'cancel'}])
|
|
|
+ ],
|
|
|
+ validate=lambda m: ('msg', 'Введите текст сообщения') if m['cmd'] == 'Отправить' and not m['msg'] else None
|
|
|
+ )
|
|
|
+
|
|
|
+ if data is None:
|
|
|
+ break
|
|
|
+
|
|
|
+ msg_box.append(put_markdown(f"`{nickname}`: {data['msg']}"))
|
|
|
+ chat_msgs.append((nickname, data['msg']))
|
|
|
+
|
|
|
+ refresh_task.close()
|
|
|
+ online_users.remove(nickname)
|
|
|
+ toast("Вы вышли из чата!")
|
|
|
+ msg_box.append(put_markdown(f'📢 `{nickname}` покинул чат!'))
|
|
|
+ chat_msgs.append(('📢', f' `{nickname}` покинул чат!'))
|
|
|
+ put_buttons(['Перезайти'], onclick=lambda btn: run_js('window.location.reload()'))
|
|
|
+
|
|
|
+
|
|
|
+async def refresh_msg(nickname, msg_box):
|
|
|
+ global chat_msgs
|
|
|
+ last_idx = len(chat_msgs)
|
|
|
+
|
|
|
+ while True:
|
|
|
+ await asyncio.sleep(1)
|
|
|
+
|
|
|
+ for m in chat_msgs[last_idx:]:
|
|
|
+ if m[0] != nickname:
|
|
|
+ msg_box.append(put_markdown(f"`{m[0]}`: {m[1]}"))
|
|
|
+
|
|
|
+ if len(chat_msgs) > MAX_MSGS_COUNT:
|
|
|
+ chat_msgs = chat_msgs[len(chat_msgs) // 2:]
|
|
|
+
|
|
|
+ last_idx = len(chat_msgs)
|
|
|
+
|
|
|
+
|
|
|
+if __name__ == "__main__":
|
|
|
+ start_server(main, debug=True, port=8078, cdn=False)
|