first commit
[archive.git] / ASCHE_0 / l1v3.ath.cx / files / l1v3 / v0.0.2 / l1v3_server_v0.0.2 / server.py
blob701e0b1a3969fb90a136cc75bd16a84afb3c56bf
1 from socket import *
2 import time
4 ###############################################
5 # Settings
6 ###############################################
7 host = ""
8 port = 3113
10 done = 0
11 userlist = []
13 #---------------------------------------------#
14 #- states ------------------------------------#
15 #---------------------------------------------#
16 sNotReg = 0
17 sReg = 1
18 #---------------------------------------------#
20 ###############################################
21 # User
22 ###############################################
23 class User:
24 def __init__(self):
25 self.addr = ""
26 self.sock = None
27 self.state = sNotReg
28 self.username = ""
30 def handleMsg(self, msg):
31 global userlist
33 str = msg.split(":", 1)
35 #sNotReg
36 if self.state == sNotReg:
37 if str[0] == "%reg%":
38 if str[1]:
39 flag = 1
40 for user in userlist:
41 if str[1] == user.username: flag = 0; break
42 if flag:
43 self.username = str[1]
44 self.state = sReg
46 for user in userlist:
47 if (user.username <> self.username) and user.username:
48 self.sock.send("%reg%:" + user.username)
50 BroadCast(self.username, "%reg%:" + self.username)
51 #sReg
52 else:
53 if msg == "%exit%":
54 self.disconnect("exit")
56 elif str[0] == "%msg%":
57 BroadCast(self.username, "%msg%:" + self.username + ":" + str[1])
59 def disconnect(self, reason):
60 self.sock.close()
61 userlist.remove(self)
62 print self.addr + " has disconnected (" + reason + ")"
63 BroadCast(self.username, "%exit%:" + self.username)
65 ###############################################
66 # BroadCast
67 ###############################################
68 def BroadCast(username, msg):
69 for user in userlist:
70 if (user.state == sReg) and (user.username <> username):
71 try:
72 size = user.sock.send(msg)
73 except:
74 user.disconnect("timeout")
76 ###############################################
77 # GetNewConnection
78 ###############################################
79 def GetNewConnection():
80 try:
81 sock, addr = srv.accept()
82 except:
83 return None
85 sock.setblocking(0)
87 user = User();
88 user.sock = sock
89 user.addr = addr[0]
91 return user
93 ###############################################
94 ###############################################
95 # Start #######################################
96 ###############################################
97 ###############################################
98 print "###############################################"
99 print "# l1v3 server v0.0.2 #"
100 print "# (c) Time Studios 2008 #"
101 print "###############################################"
103 srv = socket(AF_INET, SOCK_STREAM)
104 srv.setsockopt(SOL_SOCKET, SO_REUSEADDR, 1)
106 #---------------------------------------------#
107 #- binding -----------------------------------#
108 #---------------------------------------------#
109 print "%i binding..." %(port)
110 try:
111 srv.bind((host, port))
112 except:
113 print "Error"
114 print "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
115 exit()
116 print "Done"
117 #---------------------------------------------#
119 srv.setblocking(0)
121 srv.listen(5)
122 print "Waiting for connections..."
123 print "###############################################"
125 ###############################################
126 # Listen
127 ###############################################
128 while not done:
129 time.sleep(0.1)
131 #---------------------------------------------#
132 #- new connections ---------------------------#
133 #---------------------------------------------#
134 user = GetNewConnection()
135 if user:
136 userlist.append(user)
137 print user.addr + " has connected"
138 #---------------------------------------------#
140 for user in userlist:
141 try:
142 data = user.sock.recv(1024)
143 data = filter(lambda x: x >= " " and x <= "z", data)
145 if data:
146 if data == "shutdown":
147 done = 1
148 else:
149 user.handleMsg(data)
150 except:
151 pass
153 ###############################################
154 # Exit
155 ###############################################
156 print "###############################################"
157 print "Closing all connections..."
159 for user in userlist:
160 user.sock.close()
162 srv.close()
164 print "Done"
165 print "Exit"
166 print "###############################################"