diff --git a/AO2XP.py b/AO2XP.py index 1242885..2ae543c 100644 --- a/AO2XP.py +++ b/AO2XP.py @@ -53,9 +53,9 @@ class gamewindow(QtGui.QMainWindow): frameGm.moveCenter(centerPoint) self.move(frameGm.topLeft()) - def showGame(self, tcp, charlist, musiclist, background, evidence, areas, features=[], oocjoin=[], hplist=[], webAO_bucket=""): + def showGame(self, tcp, playerlist, charlist, musiclist, background, evidence, areas, features=[], oocjoin=[], hplist=[], webAO_bucket=""): self.gamewidget.disconnectnow = False - self.gamewidget.startGame(tcp, charlist, musiclist, background, evidence, areas, features, oocjoin, hplist, webAO_bucket) + self.gamewidget.startGame(tcp, playerlist, charlist, musiclist, background, evidence, areas, features, oocjoin, hplist, webAO_bucket) self.stackwidget.setCurrentWidget(self.gamewidget) def returnToMenu(self): diff --git a/AO2XPbase/ao2xp_themes/default/theme.py b/AO2XPbase/ao2xp_themes/default/theme.py index ae822ea..452b3e7 100644 --- a/AO2XPbase/ao2xp_themes/default/theme.py +++ b/AO2XPbase/ao2xp_themes/default/theme.py @@ -21,9 +21,15 @@ self.evidencedelete.move(8, 80) self.evidencepresent.move((714 - 304 - 22) / 2 - self.evidencepresent.button_off.size().width() / 2, self.evidencedesc.y() - self.evidencepresent.button_off.size().height()) self.msgqueueList.setGeometry(8, 8, 714 - 304 - 22, 180) +self.playerList.setGeometry(8, 8, 714 - 304 - 22, 180) self.removeQueue.resize(self.removeQueue.sizeHint()) self.removeQueue.move(8, self.msgqueueList.size().height() + 16) +self.playerKick.resize(self.playerKick.sizeHint()) +self.playerKick.move(8, self.playerList.size().height() + 16) +self.playerBan.resize(self.playerBan.sizeHint()) +self.playerBan.move(16 + self.playerKick.width(), self.playerList.size().height() + 16) + self.notmutedlabel.move(8, 8) self.unmutedlist.setGeometry(8, 24, 160, 192) self.mutedlist.setGeometry(238, 24, 160, 192) diff --git a/gameview.py b/gameview.py index 4f6d776..128658f 100644 --- a/gameview.py +++ b/gameview.py @@ -785,6 +785,7 @@ class gui(QtGui.QWidget): self.gametab_mute = QtGui.QWidget() # mute a player self.gametab_pair = QtGui.QWidget() # AO2 pair self.gametab_misc = QtGui.QWidget() # ao2xp misc/fun stuff + self.gametab_players = QtGui.QWidget() # client list self.icLog = ChatLogs(self.gametab_log, 0, self.ooclog.logfile) self.icLog.setReadOnly(True) @@ -814,6 +815,15 @@ class gui(QtGui.QWidget): self.removeQueue.setText('Delete') self.removeQueue.clicked.connect(self.onClicked_removeQueue) + self.playerList = QtGui.QListWidget(self.gametab_players) + self.playerList.itemClicked.connect(self.onClicked_playerList) + self.playerKick = QtGui.QPushButton(self.gametab_players) + self.playerKick.setText('Kick') + self.playerKick.clicked.connect(self.onClicked_playerKick) + self.playerBan = QtGui.QPushButton(self.gametab_players) + self.playerBan.setText('Ban') + self.playerBan.clicked.connect(self.onClicked_playerBan) + self.unmutedlist = QtGui.QListWidget(self.gametab_mute) self.mutedlist = QtGui.QListWidget(self.gametab_mute) self.mutebtn = QtGui.QPushButton(self.gametab_mute) @@ -876,11 +886,12 @@ class gui(QtGui.QWidget): self.misc_layout.addWidget(self.spacebartext) self.misc_layout.addWidget(self.autocaps) - self.gametabs.addTab(self.gametab_log, 'Game log') + self.gametabs.addTab(self.gametab_log, 'Log') self.gametabs.addTab(self.gametab_evidence, 'Evidence') - self.gametabs.addTab(self.gametab_msgqueue, 'Message queue') + self.gametabs.addTab(self.gametab_msgqueue, 'Queue') + self.gametabs.addTab(self.gametab_players, 'Players') self.gametabs.addTab(self.gametab_mute, 'Mute') - self.gametabs.addTab(self.gametab_iniswap, 'Easy IniSwap') + self.gametabs.addTab(self.gametab_iniswap, 'IniSwap') self.gametabs.addTab(self.gametab_pair, 'Pair') self.gametabs.addTab(self.gametab_misc, 'Misc') @@ -1054,6 +1065,8 @@ class gui(QtGui.QWidget): self.evidence = [] self.selectedevi = -1 self.present = False + self.playerlist = {} + self.selectedplayer = -1 self.myflip = 0 self.playsfx = 1 self.loadSwapCharacters() @@ -1438,14 +1451,35 @@ class gui(QtGui.QWidget): for i in range(len(self.msgqueueList)): if self.msgqueueList.item(i) == item: self.selectedmsg = i + + def onClicked_playerList(self, item): + for i in range(len(self.playerList)): + sel = self.playerList.item(i) + if sel == item: + s = sel.text() + self.selectedplayer = s[1:s.indexOf("]")] def onClicked_removeQueue(self): if self.selectedmsg == -1: - return QtGui.QMessageBox.warning(self, 'nothing selected', 'select a message from the list to remove it') + return QtGui.QMessageBox.warning(self, 'Nothing selected', 'Select a message from the list to remove it.') if len(self.msgqueueList) == 0: - return QtGui.QMessageBox.warning(self, "can't remove", 'there are no messages in the message queue\nenter a message on the Game chat to add one') + return QtGui.QMessageBox.warning(self, "Can't remove", 'There are no messages in the message queue.\nEnter a message on the Game chat to add one.') self.msgqueueList.takeItem(self.selectedmsg) del self.msgqueue[self.selectedmsg] + + def onClicked_playerKick(self): + if not self.selectedplayer == -1: + reason, ok = QtGui.QInputDialog.getText(self, "Kick a player", "Please enter the reason.", text="Being annoying") + if reason and ok: + self.tcp.send("MA#%s#0#%s#%%" % (self.selectedplayer, reason)) + + def onClicked_playerBan(self): + if not self.selectedplayer == -1: + reason, ok = QtGui.QInputDialog.getText(self, "Ban a player", "Please enter the reason.", text="Being annoying") + if reason and ok: + duration, ok = QtGui.QInputDialog.getInt(self, "Ban a player", "Please enter the ban length in minutes.", 60, 1) + if duration and ok: + self.tcp.send("MA#%s#%s#%s#%%" % (self.selectedplayer, duration, reason)) def changeEvidence(self, ind): if ind < 0: @@ -2470,11 +2504,12 @@ class gui(QtGui.QWidget): audio.stophandle(self.music) audio.freehandle(self.music) - def startGame(self, tcp, charlist, musiclist, background, evidence, areas, features=[], oocjoin=[], hplist=[], webAO_bucket=""): + def startGame(self, tcp, playerlist, charlist, musiclist, background, evidence, areas, features=[], oocjoin=[], hplist=[], webAO_bucket=""): self.willDisconnect = False self.mychar = -1 self.mychatcolor = 0 self.tcp = tcp + self.playerlist = playerlist self.charlist = charlist self.musiclist = musiclist self.evidence = evidence @@ -2553,6 +2588,7 @@ class gui(QtGui.QWidget): self.ooclog.append(msg) for song in musiclist: + song = song.replace("","&") songitem = QtGui.QListWidgetItem() songitem.setText(song) if exists(AOpath + 'sounds/music/' + song): @@ -2560,6 +2596,11 @@ class gui(QtGui.QWidget): else: songitem.setBackgroundColor(QtGui.QColor(255, 128, 128)) self.musicitems.addItem(songitem) + + for pid in playerlist: + self.updatePlayerList(pid, 0, 0) + for type in range(len(playerlist[pid])): + self.updatePlayerList(pid, 1, type, playerlist[pid][type]) self.musicslider.setValue(ini.read_ini_int("AO2XP.ini", "Audio", "Music volume", 100)) self.soundslider.setValue(ini.read_ini_int("AO2XP.ini", "Audio", "Sound volume", 100)) @@ -2575,6 +2616,7 @@ class gui(QtGui.QWidget): self.tcpthread.charSlots.connect(partial(self.charselect.setCharList, self.charlist)) self.tcpthread.showCharSelect.connect(self.charselect.show) self.tcpthread.allEvidence.connect(self.allEvidence) + self.tcpthread.updatePlayerList.connect(self.updatePlayerList) self.tcpthread.rainbowColor.connect(self.text.setStyleSheet) self.tcpthread.start() @@ -2595,6 +2637,40 @@ class gui(QtGui.QWidget): self.evidencedesc.setText('.') else: self.evidencedropdown.setCurrentIndex(self.selectedevi) + + def updatePlayerList(self, id, op, type, data=""): + id = str(id) + if op == 0: # Add or remove player + if type == 0: # Add a player + self.playerList.addItem("[%s]" % id) + if not id in self.playerlist: + self.playerlist[id] = ["", "", "", ""] + if type == 1: # Remove a player + item = self.playerList.findItems("[%s]" % id, QtCore.Qt.MatchStartsWith) + if item: + self.playerList.takeItem(self.playerList.row(item[0])) + if id in self.playerlist: + del self.playerlist[id] + else: # Update a player + if id in self.playerlist: + self.playerlist[id][type] = data + + item = self.playerList.findItems("[%s]" % id, QtCore.Qt.MatchStartsWith) + if item: + name = self.playerlist[id][0] + char = self.playerlist[id][1] + charname = self.playerlist[id][2] + text = "[%s]" % id + #4 ['s', 'cornelia (og)', 'Cornelia', '0'] + #[4] cornelia (og) (Cornelia) s + if char: + text += " %s" % char + if charname: + text += " (%s)" % charname + if name: + text += " %s" % name + item[0].setText(text) + pass class PresentButton(QtGui.QLabel): @@ -2790,6 +2866,7 @@ class TCP_Thread(QtCore.QThread): showCharSelect = QtCore.pyqtSignal() allEvidence = QtCore.pyqtSignal(list) rainbowColor = QtCore.pyqtSignal(str) + updatePlayerList = QtCore.pyqtSignal(str, int, int, str) def __init__(self, parent): super(TCP_Thread, self).__init__(parent) @@ -2942,10 +3019,20 @@ class TCP_Thread(QtCore.QThread): status = int(network[1]) statusStrings = ["You have logged out", "Wrong password", "Logged in"] self.OOC_Log.emit("%s" % (statusStrings[status+1])) - + elif header == "CHECK": #ping pingafter = time.time() self.parent.gotPing.emit(int((pingafter - pingbefore)*1000)) elif header == 'DONE': self.showCharSelect.emit() + + elif header == 'PR': + del network[0] + #print "(PR) id: %s, type: %d" % (network[0], int(network[1])) + self.updatePlayerList.emit(network[0], 0, int(network[1]), "") + + elif header == 'PU': + del network[0] + #print "(PU) id: %s, type: %d, data: %s" % (network[0], int(network[1]), network[2]) + self.updatePlayerList.emit(network[0], 1, int(network[1]), network[2]) diff --git a/mainmenu.py b/mainmenu.py index 72d0dbc..b7f797d 100644 --- a/mainmenu.py +++ b/mainmenu.py @@ -207,8 +207,8 @@ class lobby(QtGui.QWidget): self.actual_serverlist.append((ip, port, name, desc, ws_port)) def moveToGame(self, stuff): - tcp, charlist, musiclist, background, evidence, areas, features, joinooc, hplist, webAO_bucket = stuff - self.move_to_game(tcp, charlist, musiclist, background, evidence, areas, features, joinooc, hplist, webAO_bucket) + tcp, playerlist, charlist, musiclist, background, evidence, areas, features, joinooc, hplist, webAO_bucket = stuff + self.move_to_game(tcp, playerlist, charlist, musiclist, background, evidence, areas, features, joinooc, hplist, webAO_bucket) def onSettingsClicked(self): self.gamewindow.showSettings() @@ -326,8 +326,8 @@ class lobby(QtGui.QWidget): self.aoserverinfo.stop() self.aoserverinfo.start() - def move_to_game(self, tcp, charlist, musiclist, background, evidence, areas, features=[], oocjoin=[], hplist=[], webAO_bucket=""): - self.gamewindow.showGame(tcp, charlist, musiclist, background, evidence, areas, features, oocjoin, hplist, webAO_bucket) + def move_to_game(self, tcp, playerlist, charlist, musiclist, background, evidence, areas, features=[], oocjoin=[], hplist=[], webAO_bucket=""): + self.gamewindow.showGame(tcp, playerlist, charlist, musiclist, background, evidence, areas, features, oocjoin, hplist, webAO_bucket) def lobby_sendchat(self): #text = self.lobbychatinput.text().toUtf8() @@ -463,6 +463,7 @@ class AOServerInfo(QtCore.QThread): areas = [[], [], [], []] features = [] evidence = [] + playerlist = {} pingtimer = 150 readytick = -1 @@ -482,7 +483,7 @@ class AOServerInfo(QtCore.QThread): if readytick == 0: readytick = -1 try: - self.moveToGameSignal.emit([self.tcp, charlist, musiclist, background, evidence, areas, features, joinooc, hplist, self.webAO_bucket]) + self.moveToGameSignal.emit([self.tcp, playerlist, charlist, musiclist, background, evidence, areas, features, joinooc, hplist, self.webAO_bucket]) except Exception as err: self.msgbox_signal.emit(0, "Error caught while loading", traceback.format_exc(err)) self.returnToLobby.emit() @@ -620,4 +621,13 @@ class AOServerInfo(QtCore.QThread): continue name = network[1].decode("utf-8").replace('', '$').replace('', '%').replace('', '&').replace('', '#').replace('', '#') chatmsg = network[2].decode("utf-8").replace('', '$').replace('', '%').replace('', '&').replace('', '#').replace('', '#') - joinooc.append("%s: %s" % (name, chatmsg)) \ No newline at end of file + joinooc.append("%s: %s" % (name, chatmsg)) + + elif header == 'PU': + del network[0] + pid = network[0] + if not pid in playerlist: + playerlist[pid] = [] + playerlist[pid].append(network[2]) + #print "(PU) id: %d, type: %d, data: %s" % (int(network[0]), int(network[1]), network[2]) + \ No newline at end of file