class MainWin(wx.Frame): def __init__(self): wx.Frame.__init__(self, None, title='Server', size=(400, 400)) self.SetIcon(Image['icon'].GetIcon()) self.statusbar = self.CreateStatusBar() self.notexitted = True self.clients = [] self.statusbar.SetStatusText('%s connection(s) currently' % len(self.clients)) self.addWidgets() self.database = DataBase() self.Bind(wx.EVT_CLOSE, self.exit) self.show() self.thread = self.openServer() def addWidgets(self): self.text = wx.ListCtrl(self, style=wx.LC_REPORT | wx.LC_VRULES | wx.LC_HRULES) self.text.AppendColumn('Ip Address') self.text.AppendColumn('Port') self.text.AppendColumn('Username') def show(self): self.Show() def exit(self, event): self.notexitted = False self.server.close() self.Destroy() @isThread def openServer(self): self.server = sk.socket() self.server.bind((HOST, POST)) while True: try: self.server.listen() client, addr = self.server.accept() except: break self.openConnection(client, addr) self.clients.append(client) @isThread def openConnection(self, client, addr): self.statusbar.SetStatusText('%s connection(s) currently' % len(self.clients)) if recvOnSocket(client) != 'test': online = False status = recvOnSocket(client) user = recvOnSocket(client) pasw = recvOnSocket(client) if user != '' and pasw != '': if status == 'register': sex = recvOnSocket(client) check = self.database.checkAccount(user) if check == 'OK': self.database.addAccount(user, pasw, sex) elif status == 'log in': check = self.database.checkAccount(user, pasw) if check == 'OK': self.text.Append((addr[0], addr[1], user)) online = True if not sendOnSocket(client, check): online = False if online: self.database.setOnline(user, True) history = [{}, {}] #0.after 1.before while online and self.notexitted: #print(user, check) data = recvOnSocket(client) #if data!='check': print(user + ': ' + data, time.time()) if data == '': break elif data == 'check': if not self.check(client, user, history): break elif data == 'avatar': if not self.getAvatar(client, user): break elif data == 'loadfriendlist': if not self.loadFriendList(client, user): break elif data == 'addfriend': if not self.addFriend(client, user): break elif data == 'changeavatar': if not self.changeAvatar(client, user): break elif data == 'newmsg': if not self.sendMsg(client, user): break elif data == 'loadhistory': if not self.loadHistory(client, user, history): break elif data == 'startchat': if not self.startChat(client, user, history): break elif data == 'announcement': if not self.announcement(client, user): break if online: self.database.setOnline(user, False) for item in range(self.text.GetItemCount()): if (self.text.GetItemText(item, 0) == addr[0] and self.text.GetItemText(item, 1) == str(addr[1]) and self.text.GetItemText(item, 2) == user): self.text.DeleteItem(item) break client.close() self.clients.remove(client) self.statusbar.SetStatusText('%s connection(s) currently' % len(self.clients)) def check(self, client, user, history): data = self.database.checkNewMsg(user) #print(user+': ', data) if data: if not sendOnSocket(client, data[0]): return False if data[0] == 'addfriend': if not sendOnSocket(client, data[1]): return False elif data[0] == 'online': if not sendOnSocket(client, data[1]): return False if not sendOnSocket(client, data[3]): return False if not sendOnSocket( client, self.database.getAvatar([(data[1], )])[0][0]): return False elif data[0] == 'newmsg': if data[1] not in history[0].keys(): history[0].update({data[1]: data[2]}) history[1].update({data[1]: data[2] - 86400}) if not sendOnSocket(client, data[1]): return False if not sendOnSocket(client, time.ctime(data[2])): return False if not sendOnSocket(client, data[3]): return False elif data[0] == 'announcement': if not sendOnSocket(client, data[1]): return False if not sendOnSocket(client, time.ctime(data[2])): return False if not sendOnSocket(client, data[3]): return False else: if not sendOnSocket(client, 'NO'): return False return True def getAvatar(self, client, user): if not sendOnSocket(client, self.database.getAvatar([(user, )])[0][0]): return False return True def loadFriendList(self, client, user): data = self.database.getFriendList(user) l = len(data) if not sendOnSocket(client, str(l)): return False if l != 0: avatar = self.database.getAvatar(data) online = self.database.getOnline(data) for i in range(l): if not sendOnSocket(client, data[i][0]): return False if not sendOnSocket(client, avatar[i][0]): return False if not sendOnSocket(client, online[i][0]): return False return True def addFriend(self, client, user): friend = recvOnSocket(client) if friend == '': return False if self.database.checkAccount(friend) == 'user is available': self.database.addFriend(user, friend) if not sendOnSocket(client, 'OK'): return False else: if not sendOnSocket(client, 'Username is not available'): return False return True def changeAvatar(self, client, user): avatar = recvOnSocket(client) if avatar == '': return False self.database.changeAvatar(user, avatar) if not self.getAvatar(client, user): return False self.database.setOnline(user, True) return True def sendMsg(self, client, From): To = recvOnSocket(client) content = recvOnSocket(client) if To == '' or content == '': return False t = time.time() self.database.sendMsg(From, To, content, t) if not sendOnSocket(client, time.ctime(t)): return False return True def loadHistory(self, client, user, history): friend = recvOnSocket(client) if friend == '': return False data = self.database.loadHistory(user, friend, history[0][friend], history[1][friend]) history[0][friend] -= 86400 history[1][friend] -= 86400 l = len(data) if not sendOnSocket(client, str(l)): return False for line in data: if not sendOnSocket(client, line): return False if not sendOnSocket(client, time.ctime(history[0][friend])): return False return True def startChat(self, client, user, history): friend = recvOnSocket(client) if friend not in history[0].keys(): history[0].update({friend: time.time()}) history[1].update({friend: time.time() - 86400}) if friend == '': return False avatars = self.database.getAvatar(((user, ), (friend, ))) for data in avatars: if not sendOnSocket(client, data[0]): return False if not sendOnSocket(client, time.ctime(history[0][friend])): return False return True def announcement(self, client, From): To = recvOnSocket(client) content = recvOnSocket(client) if To == '' or content == '': return False t = time.time() self.database.announcement(From, To, content, t) return True