def __init__(self): """self.servers is a list of tuples containing server and last playername""" QDialog.__init__(self, None) decorateWindow(self, i18nc('kajongg', 'Login')) self.setupUi() localName = i18nc('kajongg name for local game server', Query.localServerName) self.servers = Query( 'select url,lastname from server order by lasttime desc').records servers = list(x[0] for x in self.servers if x[0] != Query.localServerName) # the first server combobox item should be default: either the last used server # or localName for autoPlay if localName not in servers: servers.append(localName) if 'kajongg.org' not in servers: servers.append('kajongg.org') if Internal.autoPlay: demoHost = Options.host or localName if demoHost in servers: servers.remove( demoHost ) # we want a unique list, it will be re-used for all following games servers.insert(0, demoHost) # in this process but they will not be autoPlay self.cbServer.addItems(servers) self.passwords = Query( 'select url, p.name, passwords.password from passwords, player p ' 'where passwords.player=p.id').records Players.load() self.cbServer.editTextChanged.connect(self.serverChanged) self.cbUser.editTextChanged.connect(self.userChanged) self.serverChanged() StateSaver(self)
def __haveLoginData(self, arguments): """user entered login data, now try to login to server""" self.url, self.username, self.password, self.ruleset = arguments if self.url.isLocalHost: # we have localhost if we play a Local Game: client and server are identical, # we have no security concerns about creating a new account Players.createIfUnknown(self.dlg.cbUser.currentText())
def __init__(self): """self.servers is a list of tuples containing server and last playername""" QDialog.__init__(self, None) self.setWindowTitle(m18n('Login') + ' - Kajongg') self.setupUi() localName = m18nc('kajongg name for local game server', Query.localServerName) self.servers = Query('select url,lastname from server order by lasttime desc').records servers = [m18nc('kajongg name for local game server', x[0]) for x in self.servers] # the first server combobox item should be default: either the last used server # or localName for autoPlay if localName not in servers: servers.append(localName) if 'kajongg.org' not in servers: servers.append('kajongg.org') demoHost = Options.host or localName if demoHost in servers: servers.remove(demoHost) # we want a unique list, it will be re-used for all following games servers.insert(0, demoHost) # in this process but they will not be autoPlay self.cbServer.addItems(servers) self.passwords = Query('select url, p.name, passwords.password from passwords, player p ' 'where passwords.player=p.id').records Players.load() self.cbServer.editTextChanged.connect(self.serverChanged) self.cbUser.editTextChanged.connect(self.userChanged) self.serverChanged() StateSaver(self)
def __haveLoginData(self, arguments): """user entered login data, now try to login to server""" if self.url == 'localhost': # we have localhost if we play a Local Game: client and server are identical, # we have no security concerns about creating a new account Players.createIfUnknown(unicode(self.dlg.cbUser.currentText())) self.useSocket, self.url, self.username, self.ruleset = arguments self.__checkExistingConnections()
def __adduser(self): """create a user account""" assert self.url is not None if not self.url.isLocalHost: if not AddUserDialog(self.url, self.dlg.username, self.dlg.password).exec_(): raise CancelledError Players.createIfUnknown(self.username) adduserCmd = SERVERMARK.join( ['adduser', self.dlg.username, self.dlg.password]) return self.loginCommand(adduserCmd)
def __adduser(self): """create a user account""" assert self.url is not None if self.dlg.host != Query.localServerName: if not AddUserDialog(self.dlg.url, self.dlg.username, self.dlg.password).exec_(): return Players.createIfUnknown(self.username) adduserCmd = SERVERMARK.join(['adduser', self.dlg.username, self.dlg.password]) return self.loginCommand(adduserCmd)
def __adduser(self): """create a user account""" assert self.url is not None if self.dlg.host != Query.localServerName: if not AddUserDialog(self.dlg.url, self.dlg.username, self.dlg.password).exec_(): return Players.createIfUnknown(self.username) adduserCmd = SERVERMARK.join( ['adduser', self.dlg.username, self.dlg.password]) return self.loginCommand(adduserCmd)
def _ai_make_move(self, dt): '''Have the AI make its next move''' if not self.two_player: ai_move = AI.get_next_move( self.board, Players.other_player(self.human_player)) if ai_move: ai_move_row, ai_move_columnn = ai_move self._make_move(ai_move_row, ai_move_columnn)
def updateServerInfoInDatabase(self): """we are online. Update table server.""" lasttime = datetime.datetime.now().replace(microsecond=0).isoformat() url = english(self.url) # use unique name for Local Game with Transaction(): serverKnown = Query('update server set lastname=?,lasttime=? where url=?', list([self.username, lasttime, url])).rowcount() == 1 if not serverKnown: Query('insert into server(url,lastname,lasttime) values(?,?,?)', list([url, self.username, lasttime])) # needed if the server knows our name but our local data base does not: Players.createIfUnknown(self.username) playerId = Players.allIds[self.username] with Transaction(): if Query('update passwords set password=? where url=? and player=?', list([self.password, url, playerId])).rowcount() == 0: Query('insert into passwords(url,player,password) values(?,?,?)', list([url, playerId, self.password]))
def __updateServerInfoInDatabase(self): """we are online. Update table server.""" lasttime = datetime.datetime.now().replace(microsecond=0).isoformat() with Internal.db: serverKnown = Query( 'update server set lastname=?,lasttime=? where url=?', (self.username, lasttime, self.url)).rowcount() == 1 if not serverKnown: Query( 'insert into server(url,lastname,lasttime) values(?,?,?)', (self.url, self.username, lasttime)) # needed if the server knows our name but our local data base does not: Players.createIfUnknown(self.username) playerId = Players.allIds[self.username] with Internal.db: if Query( 'update passwords set password=? where url=? and player=?', (self.password, self.url, playerId)).rowcount() == 0: Query( 'insert into passwords(url,player,password) values(?,?,?)', (self.url, playerId, self.password))
def _undo_move(self): '''Internal method to undo the previous move''' # Remove move from internal board move = self.board.undo_move() # If there was a move to undo if move: row, column = move # Remove player's icon from tile self.grid.set_tile_icon( row, column, self.player_icons[Players.unplayed]) # Return to previous turn self.player = Players.other_player(self.player) self.previous.title = self.player_names[self.player]
def updateServerInfoInDatabase(self): """we are online. Update table server.""" lasttime = datetime.datetime.now().replace(microsecond=0).isoformat() url = english(self.url) # use unique name for Local Game with Transaction(): serverKnown = Query( 'update server set lastname=?,lasttime=? where url=?', list([self.username, lasttime, url])).rowcount() == 1 if not serverKnown: Query( 'insert into server(url,lastname,lasttime) values(?,?,?)', list([url, self.username, lasttime])) # needed if the server knows our name but our local data base does not: Players.createIfUnknown(self.username) playerId = Players.allIds[self.username] with Transaction(): if Query( 'update passwords set password=? where url=? and player=?', list([self.password, url, playerId])).rowcount() == 0: Query( 'insert into passwords(url,player,password) values(?,?,?)', list([url, playerId, self.password]))
def _handle_move_results(self, win_status): '''Handle the results of a move Based on the results of a move, end a game and display win/tie message or just advance to the next turn ''' gameover, winner = win_status if gameover: self.game_over = True # Cat's game if winner == Results.tie: self.message.display_message("Cat's game!") else: self.grid.display_win(self.board.get_winning_streak()) Clock.schedule_once(self._display_win_message, 0.3) return False # If no win, advance to next turn self.player = Players.other_player(self.player) self.previous.title = self.player_names[self.player] return True
def game_loop(self): self.connection() players = Players.Players(self.w) game = Game.Game(self.w, players, self.process) players.setMe(self.me) i = 0 while i < 2: game.printwaiting() game.geteventtab() socket_list = [sys.stdin, self.s] ready_to_read, ready_to_write, in_error = select.select( socket_list, [], [], 0.05) for sock in ready_to_read: if sock == self.s: # incoming message from remote server, s data = sock.recv(4096) if not data: print '\nDisconnected from server' sys.exit() else: data = data.split('\n') for enemy in data: enemy = enemy.split('#') if (len(enemy) > 3): players.setNewEnemy(enemy[0], enemy[1], enemy[2], enemy[3], 90) i += 1 game.clearbackground() game.display() while 1: socket_list = [sys.stdin, self.s] # Get the list sockets which are readable ready_to_read, ready_to_write, in_error = select.select( socket_list, [], [], 0.05) for sock in ready_to_read: if sock == self.s: data = sock.recv(4096) if not data: print '\nDisconnected from server' sys.exit() else: if data[0] == '#': # position tanks tmp_split = data[1:].split('#') game.moveEnemy(tmp_split[0], tmp_split[1], tmp_split[2], tmp_split[3]) elif data[0] == '&': # balles tmp_split = data[1:].split('&') game.bullets.addEnemy(tmp_split[0], tmp_split[1], tmp_split[2], tmp_split[3], tmp_split[4]) elif data[0] == '$': # Game tmp_split = data[1:].split('$') game.players.disconnect(tmp_split[0]) else: game.display() msg = game.getevent() if msg is not None and msg != "error": if (msg[0] != '&'): msg = "#" + self.me + '#' + msg + "#" self.s.send(msg) if len(players.tanks) < 2: if (self.process is not None): self.process.kill() exit(0)