Passed
Push — main ( d81afb...90f181 )
by Yohann
02:12
created

main.on_client_left()   A

Complexity

Conditions 1

Size

Total Lines 8
Code Lines 8

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 1
eloc 8
nop 2
dl 0
loc 8
rs 10
c 0
b 0
f 0
1
import json
2
import logging
3
4
import dotenv
5
from websocket_server import WebsocketServer
6
7
users = {}
8
9
10
def on_client(client, _srv):
11
    print(
12
        '-> Accepted new connection from',
13
        ':'.join(map(str, client['address'])),
14
        'connected'
15
    )
16
17
18
def on_client_left(client, server):
19
    print('-> Client left:', client['address'])
20
    username = users.pop(client['address'])
21
    server.send_message_to_all(
22
        msg=json.dumps(
23
            {
24
                'type': 'logout',
25
                'username': username
26
            }
27
        )
28
    )
29
30
31
def on_message_received(_client, server, data):
32
    print('-> Received message from', _client['address'], ':', data)
33
34
    data = json.JSONDecoder().decode(data)
35
36
    if data['type'] == 'login':
37
        users[_client['address']] = data['username']
38
        server.send_message_to_all(
39
            msg=json.dumps(
40
                {
41
                    'type': 'login',
42
                    'username': data['username']
43
                }
44
            )
45
        )
46
47
        server.send_message(
48
            client=_client,
49
            msg=json.dumps(
50
                {
51
                    'type': 'users',
52
                    'users': list(users.values())
0 ignored issues
show
Comprehensibility Best Practice introduced by
The variable users does not seem to be defined.
Loading history...
53
                }
54
            )
55
        )
56
57
    elif data['type'] == 'message':
58
        print(users[_client['address']])
59
        server.send_message_to_all(
60
            msg=json.dumps(
61
                {
62
                    'type': 'message',
63
                    'username': users[_client['address']],
64
                    'message': data['content']
65
                }
66
            )
67
        )
68
69
70
def main():
71
    config = dotenv.dotenv_values('.env')
72
    port = config.get('port')
73
74
    if not port:
75
        print("No port were specified in the configuration.")
76
        return
77
78
    if not port.isdigit():
79
        print("Port must be a number.")
80
        return
81
82
    server = WebsocketServer(
83
        host=config.get('ip', '0.0.0.0'),
84
        port=int(port),
85
        loglevel=logging.DEBUG
86
    )
87
88
    server.set_fn_new_client(on_client)
89
    server.set_fn_message_received(on_message_received)
90
    server.set_fn_client_left(on_client_left)
91
    server.run_forever()
92
93
94
if __name__ == '__main__':
95
    main()
96