This repository has been archived on 2025-08-18. You can view files and clone it, but you cannot make any changes to it's state, such as pushing and creating new issues, pull requests or comments.
GGS/games/GGSChat/chat.py
2011-04-11 16:27:53 +02:00

159 lines
5.1 KiB
Python

#!/usr/bin/env python
import sys, socket, thread, gobject, getpass, time
try:
import pygtk
pygtk.require("2.16")
except:
pass
try:
import gtk
import gtk.glade
except:
sys.exit(1)
class GGSChat:
def __init__(self,host, port):
#Set the Glade file
self.nicksListStore = gtk.ListStore(str)
self.gladefile = "ggschat.glade"
self.wTree = gtk.glade.XML(self.gladefile, "window1")
self.setStatus("Not connected")
self.connect(host, port)
thread.start_new_thread(self.listenChat, ())
#thread.start_new_thread(self.luserCheck, ())
#Create our dictionay and connect it
dic = {"on_window1_destroy_event" : gtk.main_quit
, "on_sendButton_clicked" : lambda x: self.chat()
, "on_entry_activate" : lambda x : self.chat()
, "on_nickBox_activate" : lambda x : self.changeNick()
, "on_chatBox_focus" : lambda x, y: self.wTree.get_widget("entry").grab_focus()
}
self.wTree.signal_autoconnect(dic)
self.wTree.get_widget("nickBox").set_text(getpass.getuser())
self.wTree.get_widget("window1").show()
self.wTree.get_widget("entry").grab_focus()
nicksList = self.wTree.get_widget("nicksList")
#self.changeNick()
nicksList.set_model(self.nicksListStore)
# self.nicksListStore.append(["Test!"])
rendererText = gtk.CellRendererText()
column = gtk.TreeViewColumn("Participants", rendererText, text=0)
column.set_sort_column_id(0)
nicksList.append_column(column)
def setStatus(self, msg):
self.wTree.get_widget("statusbar").push(0, msg)
def changeNick(self):
params = self.wTree.get_widget("nickBox").get_text()
self.s.send("Game-Command: nick\n" +
"Token: %s\n" % self.token +
"Content-Type: text\n" +
"Content-Length: %s\n" % len(params)+
"\n"+
params)
def chat(self):
exp = self.wTree.get_widget("entry").get_text()
nick = self.wTree.get_widget("nickBox").get_text()
if exp[0] == "/":
cmdStr = exp[1:].split(" ")
cmd = cmdStr[0]
params = ' '.join(cmdStr[1:])
self.s.send("Game-Command: %s\n" % cmd +
"Token: %s\n" % self.token +
"Content-Type: text\n" +
"Content-Length: %s\n" % len(params)+
"\n"+
params)
else:
self.s.send("Game-Command: chat\n"+
"Token: %s\n" % self.token +
"Content-Type: text\n"+
"Content-Length: %s\n" % (len(exp))+
"\n"+
exp+"\n")
self.wTree.get_widget("entry").set_text("")
#self.listenChat()
def connect(self, host,port):
print "Connecting"
self.setStatus("Connecting")
HOST = host # The remote host
PORT = port # The same port as used by the server
self.s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
self.s.connect((HOST, PORT))
self.setStatus("Connected!")
def protocolHandler(self, msg):
if msg["Client-Command"] == "hello":
self.token = msg["DATA"]
elif msg["Client-Command"] == "chat":
gobject.idle_add(self.updateChatText, msg["DATA"])
elif msg["Client-Command"] == "lusers":
print msg
gobject.idle_add(self.updateUsers, msg["DATA"])
def listenChat(self):
msg = {}
print "listening"
fs = self.s.makefile()
while True:
line = fs.readline()
print "Received: '%s'" % line
if line != "\n":
key = line.split(":")[0]
value = line.split(":")[1]
msg[key] = value.strip()
else:
msg["DATA"] = fs.read(int("%s" % msg["Content-Size"]))
print "Got data:", msg
self.protocolHandler(msg)
#gobject.idle_add(self.updateChatText, msg["DATA"])
# if line.split(" ")[0] == "LUSERS":
# gobject.idle_add(self.updateUsers, line)
# else:
# print msg
def updateChatText(self, text):
self.wTree.get_widget("chatBox").get_buffer().insert_at_cursor(text)
def luserCheck(self):
while True:
if self.token == None:
print "Not sending lusers cmd.."
continue
print "Sending lusers cmd.."
self.s.send("Game-Command: lusers\n" +
"Token: %s\n" % self.token +
"Content-Type: text\n" +
"Content-Length: 0\n"+
"\n")
#time.sleep(2)
def updateUsers(self, text):
evalNicks = eval(text)
self.nicksListStore.clear()
for nick in evalNicks:
self.nicksListStore.append([nick])
if __name__ == "__main__":
host = "localhost"
port = 9000
if len(sys.argv) >= 2:
host = sys.argv[1]
port = int(sys.argv[2])
chat = GGSChat(host, port)
gobject.threads_init()
gtk.main()