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)