-
Notifications
You must be signed in to change notification settings - Fork 2
Expand file tree
/
Copy pathmain.py
More file actions
121 lines (99 loc) · 3.46 KB
/
main.py
File metadata and controls
121 lines (99 loc) · 3.46 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
import argparse
import asyncio
import json
import random
import sys
from pathlib import Path
import uvicorn
import structlog
log = structlog.get_logger()
sys.path.insert(0, str(Path(__file__).resolve().parent / 'src'))
from crosschat import CrossChat # noqa: E402
from webchat import WebchatHandler, app as webchat_app # noqa: E402
FAKE_NAMES = ['Alice', 'Bob', 'Charlie', 'Diana', 'Eve', 'Frank', 'Grace', 'Hank']
def parse_args() -> argparse.Namespace:
parser = argparse.ArgumentParser()
parser.add_argument('--config', '-c', type=Path, default=Path('config.json'))
parser.add_argument('--host', type=str)
parser.add_argument('--port', type=int)
parser.add_argument('--server-id', type=str)
parser.add_argument('--console-port', type=int)
parser.add_argument('--verbose', '-v', action='store_true')
return parser.parse_args()
async def add_and_broadcast(chat: CrossChat, name: str) -> int:
return await chat.state.add_user(name)
async def main() -> int:
args = parse_args()
handler = WebchatHandler(webchat_app)
webchat_app.state.handler = handler
chat = CrossChat(
config=args.config,
host=args.host,
port=args.port,
server_id=args.server_id,
console_port=args.console_port,
verbose=args.verbose,
handler=handler,
)
with open(args.config) as f:
cfg = json.load(f)
webchat_host = cfg.get('webchat_host', '0.0.0.0')
webchat_port = cfg.get('webchat_port', 8765)
try:
try:
async with asyncio.TaskGroup() as tg:
fake_user_ids: list[int] = []
count = random.randint(1, 2)
print('adding immediate fake users')
for _ in range(count):
name = random.choice(FAKE_NAMES)
uid = await add_and_broadcast(chat, 'Imm' + name)
fake_user_ids.append(uid)
async def add_fake():
await asyncio.sleep(4)
print('adding late user')
uid = await add_and_broadcast(chat, 'LateUser1')
fake_user_ids.append(uid)
async def send_messages():
await asyncio.sleep(6)
for uid in fake_user_ids:
payload = json.dumps({'say': f'Hello from user {uid}'})
for sid, server in list(chat.state.servers.items()):
if sid != chat.state._own_id and server.online:
tg.create_task(
chat.state.publish(f'm/{chat.state._own_id}/{sid}/say/{uid}', payload=payload)
)
user = chat.state.servers[chat.state._own_id].users.get(uid)
if user:
tg.create_task(handler.on_say(user, f'Hello from user {uid}'))
webchat_app.state.crosschat = chat
webchat_config = uvicorn.Config(webchat_app, host=webchat_host, port=webchat_port, log_level='info')
webchat_server = uvicorn.Server(webchat_config)
tg.create_task(add_fake(), name='add_fake_user')
tg.create_task(send_messages(), name='send_fake_messages')
tg.create_task(chat.run(tg), name='crosschat')
tg.create_task(webchat_server.serve(), name='webchat')
try:
await chat.shutdown.wait()
finally:
log.info('shutting down webserver...')
await webchat_server.shutdown()
except* (KeyboardInterrupt, SystemExit):
pass
except* asyncio.exceptions.CancelledError:
pass
except asyncio.exceptions.CancelledError:
return 0
except ExceptionGroup as eg:
for ex in eg.exceptions:
if isinstance(ex, asyncio.exceptions.CancelledError):
continue
else:
raise ex
except (KeyboardInterrupt, SystemExit):
return 0
return 0
if __name__ == '__main__':
if sys.platform == 'win32':
asyncio.set_event_loop_policy(asyncio.WindowsSelectorEventLoopPolicy())
sys.exit(asyncio.run(main(), debug=True))