chat_room.py 2.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465
  1. """
  2. 聊天室
  3. ^^^^^^^^^^^
  4. 和当前所有在线的人聊天
  5. `Demo地址 <https://pywebio.herokuapp.com/?pywebio_api=chat_room>`_ `源码 <https://github.com/wang0618/PyWebIO/blob/master/demos/chat_room.py>`_
  6. * 使用基于协程的会话
  7. * 使用 `run_async() <pywebio.session.run_async>` 启动后台协程
  8. """
  9. from pywebio.input import *
  10. from pywebio.output import *
  11. from pywebio import start_server, run_async
  12. import asyncio
  13. chat_msgs = [] # 聊天记录 (name, msg)
  14. online_cnt = 0 # 在线人数
  15. async def refresh_msg(my_name):
  16. """刷新聊天消息"""
  17. last_idx = len(chat_msgs)
  18. while True:
  19. await asyncio.sleep(0.5)
  20. for m in chat_msgs[last_idx:]:
  21. if m[0] != my_name: # 仅刷新其他人的新信息
  22. put_markdown('`%s`: %s' % m)
  23. last_idx = len(chat_msgs)
  24. async def main():
  25. global online_cnt
  26. set_output_fixed_height(True)
  27. set_title("PyWebIO Chat Room")
  28. put_text("欢迎来到聊天室,你可以和当前所有在线的人聊天")
  29. nickname = await input("请输入你的昵称", required=True, valid_func=lambda n: '无法使用该昵称' if n == '📢' else None)
  30. online_cnt += 1
  31. chat_msgs.append(('📢', '`%s`加入聊天室. 当前在线人数 %s' % (nickname, online_cnt)))
  32. put_markdown('`📢`: `%s`加入聊天室. 当前在线人数 %s' % (nickname, online_cnt))
  33. refresh_task = run_async(refresh_msg(nickname))
  34. while True:
  35. data = await input_group('发送消息', [
  36. input(name='msg', help_text='消息内容支持Markdown 语法'),
  37. actions(name='cmd', buttons=['发送', '退出'])
  38. ])
  39. if data['cmd'] == '退出':
  40. break
  41. put_markdown('`%s`: %s' % (nickname, data['msg']))
  42. chat_msgs.append((nickname, data['msg']))
  43. online_cnt -= 1
  44. refresh_task.close()
  45. chat_msgs.append(('📢', '`%s`退出聊天室. 当前在线人数 %s' % (nickname, online_cnt)))
  46. put_text("你已经退出聊天室")
  47. if __name__ == '__main__':
  48. start_server(main, debug=True, port=8080)