-
Notifications
You must be signed in to change notification settings - Fork 2
/
Copy pathpy_otp.py
85 lines (64 loc) · 2.78 KB
/
py_otp.py
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
from panda3d.core import Filename
from panda3d.direct import DCFile
from message_director import MessageDirector, MDClient
from state_server import StateServer
from client_agent import ClientAgent
from client import Client
from database_server import DatabaseServer
import socket
import select
class PyOTP:
def __init__(self):
# Every socket client (makes the code faster)
self.clients = {}
# DC File
self.dc = DCFile()
self.dc.read(Filename("etc", "otp.dc"))
self.dc.read(Filename("etc", "toon.dc"))
# "Handlers"
self.messageDirector = MessageDirector(self)
self.clientAgent = ClientAgent(self)
self.stateServer = StateServer(self)
self.databaseServer = DatabaseServer(self)
def handleMessage(self, channels, sender, code, datagram):
"""
Transmit a received message from MD to SS, CA and DBSS
"""
self.stateServer.handle(channels, sender, code, datagram)
self.clientAgent.handle(channels, sender, code, datagram)
self.databaseServer.handle(channels, sender, code, datagram)
def flush(self):
"""
Do some socket magic
"""
# TODO: use socketserver or something different.
# We are very limited by select here
r, w, x = select.select([self.messageDirector.sock, self.clientAgent.sock] + list(self.clients), [], [], 0)
for sock in r:
if sock == self.messageDirector.sock:
sock, addr = sock.accept()
self.clients[sock] = MDClient(self.messageDirector, sock, addr)
self.messageDirector.clients.append(self.clients[sock])
elif sock == self.clientAgent.sock:
sock, addr = sock.accept()
self.clients[sock] = Client(self.clientAgent, sock, addr)
self.clientAgent.clients.append(self.clients[sock])
else:
client = self.clients[sock]
try:
data = sock.recv(2048)
except socket.error:
data = None
if not data:
del self.clients[sock]
if type(client) == MDClient:
self.messageDirector.clients.remove(client)
elif type(client) == Client:
self.clientAgent.clients.remove(client)
client.onLost()
else:
client.onData(data)
if __name__ == "__main__":
otp = PyOTP()
while True:
otp.flush()