chat.py 2.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970
  1. import asyncio
  2. from pywebio import start_server
  3. from pywebio.input import *
  4. from pywebio.output import *
  5. from pywebio.session import run_async, run_js
  6. chat_msgs = []
  7. online_users = set()
  8. MAX_MSGS_COUNT = 100
  9. async def main():
  10. global chat_msgs
  11. put_markdown('## 😈 Всем доброго времени бытия!\nСегодня начнём за террористов, там посмотрим')
  12. msg_box = output()
  13. put_scrollable(msg_box, height=500, keep_bottom=True)
  14. nickname = await input(
  15. 'Зайти в базу', required=True, placeholder='Твой ник',
  16. validate=lambda n: 'Эй балбес, ник норм придумай' if n in online_users or n == '🗣' else None
  17. )
  18. online_users.add(nickname)
  19. chat_msgs.append(('🗣', f' `{nickname}` прибыл на базу!'))
  20. msg_box.append(put_markdown(f' `{nickname}` прибыл на базу!'))
  21. refresh_task = run_async(refresh_msg(nickname, msg_box))
  22. while True:
  23. data = await input_group(
  24. '💭 Новое сообщение', [
  25. input(placeholder='Текст сообщения', name='msg'),
  26. actions(name='cmd', buttons=['Отправить', {'label': 'Выйти с базы', 'type': 'cancel'}])
  27. ],
  28. validate=lambda m: ('msg', 'Введите текст сообщения') if m['cmd'] == 'Отправить' and not m['msg'] else None
  29. )
  30. if data is None:
  31. break
  32. msg_box.append(put_markdown(f"`{nickname}`: {data['msg']}"))
  33. chat_msgs.append((nickname, data['msg']))
  34. refresh_task.close()
  35. online_users.remove(nickname)
  36. toast("Вы вышли из чата!")
  37. msg_box.append(put_markdown(f'📢 `{nickname}` покинул чат!'))
  38. chat_msgs.append(('📢', f' `{nickname}` покинул чат!'))
  39. put_buttons(['Перезайти'], onclick=lambda btn: run_js('window.location.reload()'))
  40. async def refresh_msg(nickname, msg_box):
  41. global chat_msgs
  42. last_idx = len(chat_msgs)
  43. while True:
  44. await asyncio.sleep(1)
  45. for m in chat_msgs[last_idx:]:
  46. if m[0] != nickname:
  47. msg_box.append(put_markdown(f"`{m[0]}`: {m[1]}"))
  48. if len(chat_msgs) > MAX_MSGS_COUNT:
  49. chat_msgs = chat_msgs[len(chat_msgs) // 2:]
  50. last_idx = len(chat_msgs)
  51. if __name__ == "__main__":
  52. start_server(main, debug=True, port=8078, cdn=False)