|
@@ -13,7 +13,7 @@ import asyncio
|
|
from pywebio import start_server, run_async
|
|
from pywebio import start_server, run_async
|
|
from pywebio.input import *
|
|
from pywebio.input import *
|
|
from pywebio.output import *
|
|
from pywebio.output import *
|
|
-from pywebio.session import defer_call, set_env
|
|
|
|
|
|
+from pywebio.session import defer_call, set_env, run_js
|
|
|
|
|
|
# 最大消息记录保存
|
|
# 最大消息记录保存
|
|
MAX_MESSAGES_CNT = 10 ** 4
|
|
MAX_MESSAGES_CNT = 10 ** 4
|
|
@@ -22,7 +22,7 @@ chat_msgs = [] # 聊天记录 (name, msg)
|
|
online_users = set() # 在线用户
|
|
online_users = set() # 在线用户
|
|
|
|
|
|
|
|
|
|
-async def refresh_msg(my_name):
|
|
|
|
|
|
+async def refresh_msg(my_name, msg_box):
|
|
"""刷新聊天消息"""
|
|
"""刷新聊天消息"""
|
|
global chat_msgs
|
|
global chat_msgs
|
|
last_idx = len(chat_msgs)
|
|
last_idx = len(chat_msgs)
|
|
@@ -30,7 +30,8 @@ async def refresh_msg(my_name):
|
|
await asyncio.sleep(0.5)
|
|
await asyncio.sleep(0.5)
|
|
for m in chat_msgs[last_idx:]:
|
|
for m in chat_msgs[last_idx:]:
|
|
if m[0] != my_name: # 仅刷新其他人的新信息
|
|
if m[0] != my_name: # 仅刷新其他人的新信息
|
|
- put_markdown('`%s`: %s' % m)
|
|
|
|
|
|
+ msg_box.append(put_markdown('`%s`: %s' % m))
|
|
|
|
+ run_js('$("#pywebio-scope-msg-container>div").animate({ scrollTop: $("#pywebio-scope-msg-container>div").prop("scrollHeight")}, 1000)') # hack: to scroll bottom
|
|
|
|
|
|
# 清理聊天记录
|
|
# 清理聊天记录
|
|
if len(chat_msgs) > MAX_MESSAGES_CNT:
|
|
if len(chat_msgs) > MAX_MESSAGES_CNT:
|
|
@@ -44,22 +45,24 @@ async def main():
|
|
|
|
|
|
set_env(title="PyWebIO Chat Room")
|
|
set_env(title="PyWebIO Chat Room")
|
|
|
|
|
|
- put_markdown("""欢迎来到聊天室,你可以和当前所有在线的人聊天\n
|
|
|
|
- 本应用使用不到80行代码实现,源代码[链接](https://github.com/wang0618/PyWebIO/blob/master/demos/chat_room.py)""", lstrip=True)
|
|
|
|
|
|
+ put_markdown("##PyWebIO聊天室\n欢迎来到聊天室,你可以和当前所有在线的人聊天。"
|
|
|
|
+ "本应用使用不到80行代码实现,源代码[链接](https://github.com/wang0618/PyWebIO/blob/master/dev/chat_room.py)", lstrip=True)
|
|
|
|
|
|
- nickname = await input("请输入你的昵称", required=True,
|
|
|
|
- validate=lambda n: '昵称已被使用' if n in online_users or n == '📢' else None)
|
|
|
|
|
|
+ msg_box = output()
|
|
|
|
+ with use_scope('msg-container'):
|
|
|
|
+ style(put_scrollable(msg_box, max_height=300), 'height:300px')
|
|
|
|
+ nickname = await input("请输入你的昵称", required=True, validate=lambda n: '昵称已被使用' if n in online_users or n == '📢' else None)
|
|
|
|
|
|
online_users.add(nickname)
|
|
online_users.add(nickname)
|
|
chat_msgs.append(('📢', '`%s`加入聊天室. 当前在线人数 %s' % (nickname, len(online_users))))
|
|
chat_msgs.append(('📢', '`%s`加入聊天室. 当前在线人数 %s' % (nickname, len(online_users))))
|
|
- put_markdown('`📢`: `%s`加入聊天室. 当前在线人数 %s' % (nickname, len(online_users)))
|
|
|
|
|
|
+ msg_box.append(put_markdown('`📢`: `%s`加入聊天室. 当前在线人数 %s' % (nickname, len(online_users))))
|
|
|
|
|
|
@defer_call
|
|
@defer_call
|
|
def on_close():
|
|
def on_close():
|
|
online_users.remove(nickname)
|
|
online_users.remove(nickname)
|
|
chat_msgs.append(('📢', '`%s`退出聊天室. 当前在线人数 %s' % (nickname, len(online_users))))
|
|
chat_msgs.append(('📢', '`%s`退出聊天室. 当前在线人数 %s' % (nickname, len(online_users))))
|
|
|
|
|
|
- refresh_task = run_async(refresh_msg(nickname))
|
|
|
|
|
|
+ refresh_task = run_async(refresh_msg(nickname, msg_box))
|
|
|
|
|
|
while True:
|
|
while True:
|
|
data = await input_group('发送消息', [
|
|
data = await input_group('发送消息', [
|
|
@@ -69,11 +72,12 @@ async def main():
|
|
if data is None:
|
|
if data is None:
|
|
break
|
|
break
|
|
|
|
|
|
- put_markdown('`%s`: %s' % (nickname, data['msg']))
|
|
|
|
|
|
+ msg_box.append(put_markdown('`%s`: %s' % (nickname, data['msg'])))
|
|
|
|
+ run_js('$("#pywebio-scope-msg-container>div").animate({ scrollTop: $("#pywebio-scope-msg-container>div").prop("scrollHeight")}, 1000)') # hack: to scroll bottom
|
|
chat_msgs.append((nickname, data['msg']))
|
|
chat_msgs.append((nickname, data['msg']))
|
|
|
|
|
|
refresh_task.close()
|
|
refresh_task.close()
|
|
- put_text("你已经退出聊天室")
|
|
|
|
|
|
+ toast("你已经退出聊天室")
|
|
|
|
|
|
|
|
|
|
if __name__ == '__main__':
|
|
if __name__ == '__main__':
|