Python Tiny_Chat

Questions about programming languages and debugging
Post Reply
p99
Fame ! Where are the chicks?!
Fame ! Where are the chicks?!
Posts: 291
Joined: 14 Oct 2006, 16:00
17
Location: Some hippy's van
Contact:

Python Tiny_Chat

Post by p99 »

I dug up this program a while back. And it is pretty cool. It's just a basic little chat client coded in Python. I did modify the client though. Because when I used it. If I typed as the same time as somebody else it would delete their words. I may have binded the send button to Enter as well I can't remember.

I'll post the origional client as well as the modified one. This program is covered under GPL and is allowed to be distributed and/or modified. I checked into it a while back. So here you go.

I don't remeber where I origionally got this so don't ask.

SERVER

Code: Select all

#!/usr/bin/env python

import sys
import socket
import select
import string
import thread
import time

PORT = 9999


def register_ogc(server, port_ogc, port_own, servnam):
	global client
	client=socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
	client.connect((server, port_ogc))
	while 1:
		msg="GAME:TinyChat\t0.2\t"+servnam+"\tTCP4:"+port_own+"\t%d\t29\tJoin" % num_client
		print msg
		client.sendto(msg, (server, port_ogc))
		time.sleep(1200)


def run_server(server):
	global num_client
	global inbound
	num_client = 0
	names = []

	inbound = [server]
	outbound = []
	error_track = []
	while 1:
	#	print "Ueberpruefe Clients"
		r, w, e = select.select(inbound, outbound, error_track, 1.0)
		for sock in r:
			if sock == server:
				channel, info = server.accept()
				print "Verbindung von ", info
				name = channel.recv(1024)
				if name:
					print name
					if names.count(name) == 0 and num_client<29:
						inbound.append(channel)
						names.append(name)
						num_client = num_client + 1
						channel.send("ACCEPTED")
						print "Client Nr. ", num_client
						#msg = "NAMES>"
						#for nam in names:
						#	msg = msg + ":" + nam
						#channel.send(msg)
						for i in range(num_client + 1):
							if inbound[i] != server and names[i - 1] != name:
								data = "NEW CHATTER>" + name
								print "Sende Nachricht an Client Nr. ", i
								inbound[i].send(data)
					elif num_client>=29:
						channel.send("SERVER FULL")
						channel.close()
					else:
						channel.send("NAME ALREADY EXISTS")
						channel.close()
			else:
				#print "hole Nachrichten"
				data = sock.recv(1024)
				if data:
					print data
					if string.find(data, "WHISPER") != -1:
						contents=data.split(">")
						contents=contents[1].split(":")
						#print "Nachricht fuer ", contents[0], "Nr.", names.index(contents[0])
						if names.count(contents[0]) == 1:
							inbound[names.index(contents[0])+1].send(data)
					elif string.find(data, "NAMES>") != -1:
						contents=data.split(":")
						msg = "NAMES>"
						for nam in names:
							msg = msg + ":" + nam
						inbound[names.index(contents[0])+1].send(msg)
					else:
						for i in range(num_client + 1):
							if inbound[i] != server:
								print "Sende Nachricht an Client Nr. ", i
								inbound[i].send(data)
					if string.find(data, "QUIT") != -1:
						inbound.remove(sock)
						sock.close()
						contents=data.split(":")
						names.remove(contents[0])
						num_client = num_client - 1

				else:
					inbound.remove(sock)
					sock.close()
					num_client = num_client - 1
		time.sleep(0.1)


if sys.argv[1:]:
	if sys.argv[1] == "-r":
		if sys.argv[5:]:
			PORT = int(sys.argv[5])
		else:
			PORT = 9999

	else:
		PORT = int(sys.argv[1])

server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
print "Server gestartet"
server.bind(("", PORT))
server.listen(1)
thread.start_new_thread(run_server,(server,))
print "Lausche auf Port", PORT
if sys.argv[1:]:
	if sys.argv[1] == "-r":
		thread.start_new_thread(register_ogc,(sys.argv[2], int(sys.argv[3]), "%d"%PORT, sys.argv[4],))
while 1:
	inmsg = sys.stdin.readline()
	if string.find(inmsg, "QUIT") != -1:
		break

if sys.argv[1:]:
	if sys.argv[1] == "-r":
		msg="QUIT:"
		client.sendto(msg, (sys.argv[2], int(sys.argv[3])))
		client.close()
for sock in range(num_client + 1):
	if inbound[sock] != server:
		inbound[sock].close()

server.close()












CLIENT(origional)

Code: Select all

#!/usr/bin/env python

from Tkinter import *
import tkMessageBox
import socket
import select
import sys
import thread
import time
import string

HOST = "localhost"
PORT = 9999

#listens for incoming messages from the chat server
def listen_server(connection, window):
	inbound = [connection]
	outbound = []
	error_track = []
	#global in_msg
	print "Thread gestartet"

	while 1:
		#print connection.info
		r,w,e = select.select(inbound, outbound, error_track, 1.0)
		if r:
			print "Data angekommen"
			data = connection.recv(1024)
			if data:
				if string.find(data, "NAMES>") != -1:
					#print data
					data_word = data.split(">")
					names=data_word[1].split(":")
					names=names[1:]
					names.sort()
					window.fenster.listbox.delete(0,END)
					for name in names:
						window.fenster.listbox.insert(END,name)
						#window.fenster.listbox.insert(window.fenster.listbox.size()-1,name)
						#print name

				elif string.find(data, "NEW CHATTER>") != -1:
					data_word = data.split(">")
					names.append(data_word[1])
					names.sort()
					window.fenster.listbox.delete(0,END)
					for name in names:
						window.fenster.listbox.insert(END,name)
						#window.fenster.listbox.insert(window.fenster.listbox.size()-1,name)
						#print name

				elif string.find(data, "QUIT") != -1:
					data_word = data.split(":")
					names.remove(data_word[0])
					names.sort()
					window.fenster.listbox.delete(0,END)
					for name in names:
						window.fenster.listbox.insert(END,name)

				else:
					in_msg = data
					window.print_text(in_msg)
			else:
				connection.close()

#connects the chat client to the server and checks and report if client is accepted
def start_client(host, port, nick):
	global HOST
	global PORT
	global name
	HOST = host

	PORT = port

	name = nick
	print HOST, PORT, name
	global client
	client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
	try:
		client.connect((HOST, PORT))
	except:
		tkMessageBox.showerror("Login-Error", "server unreachable")
		print "Kein Server erreichbar"
		sys.exit()

	client.send(name)
	returnmsg=client.recv(1024)
	if string.find(returnmsg, "NAME ALREADY EXISTS") != -1:
		tkMessageBox.showerror("Login-Error", "nick already exists")
		print "Login-Name wird bereits benutzt!"
		sys.exit()
	elif string.find(returnmsg, "SERVER FULL") != -1:
		tkMessageBox.showerror("Login-Error", "too many chatters")
		print "Zu viel Chatter auf dem Server!"
		sys.exit()
	elif string.find(returnmsg, "ACCEPTED") == -1:
		sys.exit()
	#returnmsg=client.recv(1024)
	print returnmsg

#disconnects client from server
def stop_client():
	try:
		client.send(name+":\tQUIT")
	except:
		print "server seems already down"
	time.sleep(1)
	client.close()
	sys.exit()

#send message to server
def send_data(message):
	message = name+": " + message
	#print message
	if string.find(message,"QUIT") != -1:
		print "Client beendet"
		try:
			client.send(message)
		except:
			print "server seems down or unreachable"
			tkMessageBox.showerror("Connection Error", "server down or unreachable")
		#time.sleep(10)
	try:
		client.send(message)
	except:
		print "server seems down or unreachable"
		tkMessageBox.showerror("Connection Error", "server down or unreachable")

#function to query Open Game Cache Server
def ogcquery(host, port, window):
	global serv_list
	serv_list=[]
	global ogcserver
	ogcserver=socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
	ogcserver.connect((host, port))
	msg="LISTGAMES:TinyChat"
	ogcserver.sendto(msg, (host, port))
	inbound=[ogcserver]
	outbound=[]
	error=[]
	while 1:
		r,w,e=select.select(inbound,outbound,error, 1.0)
		if r:
			data,server=ogcserver.recvfrom(1024)
			datapart=data.split("\t")
			serv_entry=[datapart[6],datapart[8],datapart[9],datapart[1],int(datapart[2])]
			if serv_list.count(serv_entry)==0:
				serv_list.append(serv_entry)
				listentry=datapart[6]+"  "+datapart[8]+"/"+datapart[9]
				window.ogcres.listbox.insert(END, listentry)
			for i in range(10):
				print datapart[i]
		#print data

	try:
		ogcserver.sendto("LISTQUIT:", (host, port))
		ogcserver.close()
	except:
		print "Open Game Cache Server seems to be already down or unreachable"


#window to choose if search Open Game Cache for server or connecting directly
class ChooConMode:

	def initialize(self):
		self.choocon=Tk(className="Connection")
		self.choocon.query_butt=Button(self.choocon, text="Search Server", command=self.web_search)
		self.choocon.query_butt.pack(side=TOP)
		self.choocon.connect_butt=Button(self.choocon, text="Connect", command=self.connect)
		self.choocon.connect_butt.pack(side=BOTTOM)
		self.choocon.mainloop()

	#connecting to Open Game Cache server
	def web_search(self):
		query=OGCconn()
		query.initialize()
		self.choocon.quit()
		self.choocon.destroy()

	#start direct connection window
	def connect(self):
		conn=StartWin()
		conn.initialize()
		self.choocon.quit()
		self.choocon.destroy()

#window for connection to Open Game Cache Server
class OGCconn:

	def initialize(self):
		self.ogcconn=Tk(className="Web Search")
		self.ogcconn.servlab=Label(self.ogcconn, text="Server:")
		self.ogcconn.servin=Entry(self.ogcconn, width=15)
		self.ogcconn.servin.insert(0, "x.yz.to")
		self.ogcconn.servlab.grid(column=0, row=0)
		self.ogcconn.servin.grid(column=1, row=0)
		self.ogcconn.portlab=Label(self.ogcconn, text="Port:")
		self.ogcconn.portin=Entry(self.ogcconn, width=15)
		self.ogcconn.portin.insert(0, "11111")
		self.ogcconn.portlab.grid(column=0, row=1)
		self.ogcconn.portin.grid(column=1, row=1)
		self.ogcconn.login_butt=Button(self.ogcconn, text="Query", command=self.bye)
		self.ogcconn.login_butt.grid(column=1, row=2)
		self.ogcconn.mainloop()

	#query Open Game cache server for available TinyChat servers
	def bye(self):
		conn=OGCresult()
		conn.initialize()
		thread.start_new_thread(ogcquery, (self.ogcconn.servin.get(), int(self.ogcconn.portin.get()), conn))
		conn.start()
		self.ogcconn.quit()
		self.ogcconn.destroy()

class OGCresult:

	def initialize(self):
		self.ogcres=Tk(className="Servers")
		self.ogcres.top_frame=Frame(self.ogcres)
		self.ogcres.scrollbar=Scrollbar(self.ogcres.top_frame)
		self.ogcres.listbox=Listbox(self.ogcres.top_frame, selectmode=SINGLE, width=20, yscrollcommand=self.ogcres.scrollbar.set)
		self.ogcres.listbox.grid(column=2, row=0)
		self.ogcres.scrollbar.config(command=self.ogcres.listbox.yview)
		self.ogcres.listbox.pack(side=LEFT)
		self.ogcres.scrollbar.pack(side=RIGHT, fill=Y)
		self.ogcres.down_frame=Frame(self.ogcres)
		self.ogcres.nicklab=Label(self.ogcres.down_frame, text="Nickname")
		self.ogcres.nickin=Entry(self.ogcres.down_frame, width=15)
		self.ogcres.login_butt=Button(self.ogcres.down_frame, text="Login", command=self.bye)
		self.ogcres.nicklab.grid(column=0, row=0)
		self.ogcres.nickin.grid(column=1, row=0)
		self.ogcres.login_butt.grid(column=1, row=1)
		self.ogcres.top_frame.pack(side=TOP)
		self.ogcres.down_frame.pack(side=BOTTOM)

	def start(self):
		self.ogcres.mainloop()

	def bye(self):
		for serv_dat in serv_list:
			if self.ogcres.listbox.get(self.ogcres.listbox.curselection()).count(serv_dat[0]) == 1:
					start_client(serv_dat[3], serv_dat[4], self.ogcres.nickin.get())
		self.ogcres.quit()
		self.ogcres.destroy()



#window for direct input of server name and port and connection
class StartWin:

	def initialize(self):
		self.startw=Tk(className="Login")
		self.startw.servlab=Label(self.startw, text="Server:")
		self.startw.servin=Entry(self.startw, width=15)
		self.startw.servlab.grid(column=0, row=0)
		self.startw.servin.grid(column=1, row=0)
		self.startw.portlab=Label(self.startw, text="Port:")
		self.startw.portin=Entry(self.startw, width=15)
		self.startw.portlab.grid(column=0, row=1)
		self.startw.portin.grid(column=1, row=1)
		self.startw.nicklab=Label(self.startw, text="Nickname:")
		self.startw.nickin=Entry(self.startw, width=15)
		self.startw.nicklab.grid(column=0, row=2)
		self.startw.nickin.grid(column=1, row=2)
		self.startw.login_butt=Button(self.startw, text="Login", command=self.bye)
		self.startw.login_butt.grid(column=1, row=3)
		self.startw.mainloop()

	#connect client with inserted data
	def bye(self):
		start_client(self.startw.servin.get(), int(self.startw.portin.get()), self.startw.nickin.get())
		self.startw.quit()
		self.startw.destroy()


#main chat window
class Tkclient:

	#def _init_(self):
	#	width="10c"
	#	height="5c"

	def startWindow(self):
		self.fenster=Tk(className="tkclient")
		#self.fenster.canvas=Canvas(self.fenster, width="10c", height="5c")
		#self.fenster.canvas.pack()
		self.fenster.top_frame=Frame(self.fenster)
		self.fenster.scrollbar1=Scrollbar(self.fenster.top_frame)
		self.fenster.scrollbar2=Scrollbar(self.fenster.top_frame)
		self.fenster.scrollbar1.grid(column=1, row=0, ipady=65, padx=0)
		self.fenster.scrollbar2.grid(column=3, row=0, ipady=65, padx=0)
		self.fenster.text=Text(self.fenster.top_frame, width=40, height=13, wrap=WORD, yscrollcommand=self.fenster.scrollbar1.set)
		self.fenster.scrollbar1.config(command=self.fenster.text.yview)
		self.fenster.text.grid(column=0, row=0)
		self.fenster.listbox=Listbox(self.fenster.top_frame, selectmode=SINGLE, width=15, yscrollcommand=self.fenster.scrollbar2.set)
		self.fenster.listbox.grid(column=2, row=0)
		self.fenster.scrollbar2.config(command=self.fenster.listbox.yview)
		self.fenster.down_frame=Frame(self.fenster)
		self.fenster.inbox=Entry(self.fenster.down_frame, width=40)
		self.fenster.inbox.grid(column=0, row=0)
		self.fenster.quit_butt=Button(self.fenster.down_frame,text="Quit",command=stop_client)
		self.fenster.quit_butt.grid(column=1, row=0)
		#start_client()
		self.fenster.send_butt=Button(self.fenster.down_frame,text="Send",command=self.do_something)
		self.fenster.send_butt.grid(column=2, row=0)
		self.fenster.whis_butt=Button(self.fenster.down_frame,text="Whisper",command=self.whisper)
		self.fenster.whis_butt.grid(column=3, row=0)
		self.fenster.top_frame.pack(side=TOP)
		self.fenster.down_frame.pack(side=BOTTOM)
		self.messageline=""
		send_data("NAMES>")
		self.fenster.mainloop()

	#send data to server
	def do_something(self):
		msg=self.fenster.inbox.get()
		#print "hallo"
		#self.fenster.text.insert(END,msg+"\n")
		self.fenster.inbox.delete(0,END)
		#self.fenster.text.see(END)
		send_data(msg)
		print msg

	#send private message
	def whisper(self):
		msg=self.fenster.inbox.get()
		recipient=self.fenster.listbox.get(self.fenster.listbox.curselection())
		self.fenster.inbox.delete(0, END)
		#print recipient
		msg="WHISPER>" + recipient + ": " + msg
		self.fenster.text.insert(END,msg+"\n")
		self.fenster.text.see(END)
		send_data(msg)
		print msg

	def poll_msg(self):
		if self.messageline != in_msg:
			self.messageline = in_msg
			self.print_text(self.messageline)


	#print message to text field
	def print_text(self, msg):
		#msg=self.messageline
		self.fenster.text.insert(END,msg+"\n")
		#self.fenster.inbox.delete(0,29)
		self.fenster.text.see(END)
		print msg










print "Wir starten"
pre=ChooConMode()
pre.initialize()
root=Tkclient()
#start_client(sys.argv[1], int(sys.argv[2]),sys.argv[3])
thread.start_new_thread(listen_server, (client, root))
root.startWindow()
#while(1):
#	root.poll_msg()
#root.do_something()




CLIENT(modified by me)

Code: Select all

#!/usr/bin/env python

from Tkinter import *
import tkMessageBox
import socket
import select
import sys
import thread
import time
import string

HOST = "localhost"
PORT = 9999

#listens for incoming messages from the chat server
def listen_server(connection, window):
	inbound = [connection]
	outbound = []
	error_track = []
	#global in_msg
	print "Thread gestartet"

	while 1:
		#print connection.info
		r,w,e = select.select(inbound, outbound, error_track, 1.0)
		if r:
			print "Data angekommen"
			data = connection.recv(1024)
			if data:
				if string.find(data, "NAMES>") != -1:
					#print data
					data_word = data.split(">")
					names=data_word[1].split(":")
					names=names[1:]
					names.sort()
					window.fenster.listbox.delete(0,END)
					for name in names:
						window.fenster.listbox.insert(END,name)
						#window.fenster.listbox.insert(window.fenster.listbox.size()-1,name)
						#print name

				elif string.find(data, "NEW CHATTER>") != -1:
					data_word = data.split(">")
					names.append(data_word[1])
					names.sort()
					window.fenster.listbox.delete(0,END)
					for name in names:
						window.fenster.listbox.insert(END,name)
						#window.fenster.listbox.insert(window.fenster.listbox.size()-1,name)
						#print name

				elif string.find(data, "QUIT") != -1:
					data_word = data.split(":")
					names.remove(data_word[0])
					names.sort()
					window.fenster.listbox.delete(0,END)
					for name in names:
						window.fenster.listbox.insert(END,name)

				else:
					in_msg = data
					window.print_text(in_msg)
			else:
				connection.close()

#connects the chat client to the server and checks and report if client is accepted
def start_client(host, port, nick):
	global HOST
	global PORT
	global name
	HOST = host

	PORT = port

	name = nick
	print HOST, PORT, name
	global client
	client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
	try:
		client.connect((HOST, PORT))
	except:
		tkMessageBox.showerror("Login-Error", "server unreachable")
		print "Kein Server erreichbar"
		sys.exit()

	client.send(name)
	returnmsg=client.recv(1024)
	if string.find(returnmsg, "NAME ALREADY EXISTS") != -1:
		tkMessageBox.showerror("Login-Error", "nick already exists")
		print "Login-Name wird bereits benutzt!"
		sys.exit()
	elif string.find(returnmsg, "SERVER FULL") != -1:
		tkMessageBox.showerror("Login-Error", "too many chatters")
		print "Zu viel Chatter auf dem Server!"
		sys.exit()
	elif string.find(returnmsg, "ACCEPTED") == -1:
		sys.exit()
	#returnmsg=client.recv(1024)
	print returnmsg

#disconnects client from server
def stop_client():
	try:
		client.send(name+":\tQUIT")
	except:
		print "server seems already down"
	time.sleep(1)
	client.close()
	sys.exit()

#send message to server
def send_data(message):
	message = name+": " + message
	#print message
	if string.find(message,"QUIT") != -1:
		print "Client beendet"
		try:
			client.send(message)
		except:
			print "server seems down or unreachable"
			tkMessageBox.showerror("Connection Error", "server down or unreachable")
		#time.sleep(10)
	try:
		client.send(message)
	except:
		print "server seems down or unreachable"
		tkMessageBox.showerror("Connection Error", "server down or unreachable")

#function to query Open Game Cache Server
def ogcquery(host, port, window):
	global serv_list
	serv_list=[]
	global ogcserver
	ogcserver=socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
	ogcserver.connect((host, port))
	msg="LISTGAMES:TinyChat"
	ogcserver.sendto(msg, (host, port))
	inbound=[ogcserver]
	outbound=[]
	error=[]
	while 1:
		r,w,e=select.select(inbound,outbound,error, 1.0)
		if r:
			data,server=ogcserver.recvfrom(1024)
			datapart=data.split("\t")
			serv_entry=[datapart[6],datapart[8],datapart[9],datapart[1],int(datapart[2])]
			if serv_list.count(serv_entry)==0:
				serv_list.append(serv_entry)
				listentry=datapart[6]+"  "+datapart[8]+"/"+datapart[9]
				window.ogcres.listbox.insert(END, listentry)
			for i in range(10):
				print datapart[i]
		#print data

	try:
		ogcserver.sendto("LISTQUIT:", (host, port))
		ogcserver.close()
	except:
		print "Open Game Cache Server seems to be already down or unreachable"


#window to choose if search Open Game Cache for server or connecting directly
class ChooConMode:

	def initialize(self):
		self.choocon=Tk(className="Connection")
		self.choocon.query_butt=Button(self.choocon, text="Search Server", command=self.web_search)
		self.choocon.query_butt.pack(side=TOP)
		self.choocon.connect_butt=Button(self.choocon, text="Connect", command=self.connect)
		self.choocon.connect_butt.pack(side=BOTTOM)
		self.choocon.mainloop()

	#connecting to Open Game Cache server
	def web_search(self):
		query=OGCconn()
		query.initialize()
		self.choocon.quit()
		self.choocon.destroy()

	#start direct connection window
	def connect(self):
		conn=StartWin()
		conn.initialize()
		self.choocon.quit()
		self.choocon.destroy()

#window for connection to Open Game Cache Server
class OGCconn:

	def initialize(self):
		self.ogcconn=Tk(className="Web Search")
		self.ogcconn.servlab=Label(self.ogcconn, text="Server:")
		self.ogcconn.servin=Entry(self.ogcconn, width=15)
		self.ogcconn.servin.insert(0, "x.yz.to")
		self.ogcconn.servlab.grid(column=0, row=0)
		self.ogcconn.servin.grid(column=1, row=0)
		self.ogcconn.portlab=Label(self.ogcconn, text="Port:")
		self.ogcconn.portin=Entry(self.ogcconn, width=15)
		self.ogcconn.portin.insert(0, "11111")
		self.ogcconn.portlab.grid(column=0, row=1)
		self.ogcconn.portin.grid(column=1, row=1)
		self.ogcconn.login_butt=Button(self.ogcconn, text="Query", command=self.bye)
		self.ogcconn.login_butt.grid(column=1, row=2)
		self.ogcconn.mainloop()

	#query Open Game cache server for available TinyChat servers
	def bye(self):
		conn=OGCresult()
		conn.initialize()
		thread.start_new_thread(ogcquery, (self.ogcconn.servin.get(), int(self.ogcconn.portin.get()), conn))
		conn.start()
		self.ogcconn.quit()
		self.ogcconn.destroy()

class OGCresult:

	def initialize(self):
		self.ogcres=Tk(className="Servers")
		self.ogcres.top_frame=Frame(self.ogcres)
		self.ogcres.scrollbar=Scrollbar(self.ogcres.top_frame)
		self.ogcres.listbox=Listbox(self.ogcres.top_frame, selectmode=SINGLE, width=20, yscrollcommand=self.ogcres.scrollbar.set)
		self.ogcres.listbox.grid(column=2, row=0)
		self.ogcres.scrollbar.config(command=self.ogcres.listbox.yview)
		self.ogcres.listbox.pack(side=LEFT)
		self.ogcres.scrollbar.pack(side=RIGHT, fill=Y)
		self.ogcres.down_frame=Frame(self.ogcres)
		self.ogcres.nicklab=Label(self.ogcres.down_frame, text="Nickname")
		self.ogcres.nickin=Entry(self.ogcres.down_frame, width=15)
		self.ogcres.login_butt=Button(self.ogcres.down_frame, text="Login", command=self.bye)
		self.ogcres.nicklab.grid(column=0, row=0)
		self.ogcres.nickin.grid(column=1, row=0)
		self.ogcres.login_butt.grid(column=1, row=1)
		self.ogcres.top_frame.pack(side=TOP)
		self.ogcres.down_frame.pack(side=BOTTOM)

	def start(self):
		self.ogcres.mainloop()

	def bye(self):
		for serv_dat in serv_list:
			if self.ogcres.listbox.get(self.ogcres.listbox.curselection()).count(serv_dat[0]) == 1:
					start_client(serv_dat[3], serv_dat[4], self.ogcres.nickin.get())
		self.ogcres.quit()
		self.ogcres.destroy()



#window for direct input of server name and port and connection
class StartWin:

	def initialize(self):
		self.startw=Tk(className="Login")
		self.startw.servlab=Label(self.startw, text="Server:")
		self.startw.servin=Entry(self.startw, width=15)
		self.startw.servlab.grid(column=0, row=0)
		self.startw.servin.grid(column=1, row=0)
		self.startw.portlab=Label(self.startw, text="Port:")
		self.startw.portin=Entry(self.startw, width=15)
		self.startw.portlab.grid(column=0, row=1)
		self.startw.portin.grid(column=1, row=1)
		self.startw.nicklab=Label(self.startw, text="Nickname:")
		self.startw.nickin=Entry(self.startw, width=15)
		self.startw.nicklab.grid(column=0, row=2)
		self.startw.nickin.grid(column=1, row=2)
		self.startw.login_butt=Button(self.startw, text="Login", command=self.bye)
		self.startw.login_butt.grid(column=1, row=3)
		self.startw.mainloop()

	#connect client with inserted data
	def bye(self):
		start_client(self.startw.servin.get(), int(self.startw.portin.get()), self.startw.nickin.get())
		self.startw.quit()
		self.startw.destroy()


#main chat window
class Tkclient:

	#def _init_(self):
	#	width="10c"
	#	height="5c"

	def startWindow(self):
		self.fenster=Tk(className="tkclient")
		#self.fenster.canvas=Canvas(self.fenster, width="10c", height="5c")
		#self.fenster.canvas.pack()
		self.fenster.top_frame=Frame(self.fenster)
		self.fenster.scrollbar1=Scrollbar(self.fenster.top_frame)
		self.fenster.scrollbar2=Scrollbar(self.fenster.top_frame)
		self.fenster.scrollbar1.grid(column=1, row=0, ipady=65, padx=0)
		self.fenster.scrollbar2.grid(column=3, row=0, ipady=65, padx=0)
		self.fenster.text=Text(self.fenster.top_frame, width=40, height=13, wrap=WORD, yscrollcommand=self.fenster.scrollbar1.set)
		self.fenster.scrollbar1.config(command=self.fenster.text.yview)
		self.fenster.text.grid(column=0, row=0)
		self.fenster.listbox=Listbox(self.fenster.top_frame, selectmode=SINGLE, width=15, yscrollcommand=self.fenster.scrollbar2.set)
		self.fenster.listbox.grid(column=2, row=0)
		self.fenster.scrollbar2.config(command=self.fenster.listbox.yview)
		self.fenster.down_frame=Frame(self.fenster)
		self.fenster.inbox=Entry(self.fenster.down_frame, width=40)
		self.fenster.inbox.grid(column=0, row=0)
		self.fenster.quit_butt=Button(self.fenster.down_frame,text="Quit",command=stop_client)
		self.fenster.quit_butt.grid(column=1, row=0)
		#start_client()
		self.fenster.send_butt=Button(self.fenster.down_frame,text="Send",command=self.do_something)
		self.fenster.send_butt.bind('<Enter>',self.do_somthing)
		self.fenster.send_butt.grid(column=2, row=0)
		self.fenster.whis_butt=Button(self.fenster.down_frame,text="Whisper",command=self.whisper)
		self.fenster.whis_butt.grid(column=3, row=0)
		self.fenster.top_frame.pack(side=TOP)
		self.fenster.down_frame.pack(side=BOTTOM)
		self.messageline=""
		send_data("NAMES>")
		self.fenster.mainloop()

	#send data to server
	def do_something(self):
		msg=self.fenster.inbox.get()
		#print "hallo"
		#self.fenster.text.insert(END,msg+"\n")
		self.fenster.inbox.delete(0,END)
		#self.fenster.text.see(END)
		send_data(msg)
		print msg

	#send private message
	def whisper(self):
		msg=self.fenster.inbox.get()
		recipient=self.fenster.listbox.get(self.fenster.listbox.curselection())
		self.fenster.inbox.delete(0, END)
		#print recipient
		msg="WHISPER>" + recipient + ": " + msg
		self.fenster.text.insert(END,msg+"\n")
		self.fenster.text.see(END)
		send_data(msg)
		print msg

	def poll_msg(self):
		if self.messageline != in_msg:
			self.messageline = in_msg
			self.print_text(self.messageline)


	#print message to text field
	def print_text(self, msg):
		#msg=self.messageline
		self.fenster.text.insert(END,msg+"\n")
		#self.fenster.inbox.delete(0,29)
		self.fenster.text.see(END)
		print msg










print "Wir starten"
pre=ChooConMode()
pre.initialize()
root=Tkclient()
#start_client(sys.argv[1], int(sys.argv[2]),sys.argv[3])
thread.start_new_thread(listen_server, (client, root))
root.startWindow()
#while(1):
#	root.poll_msg()
#root.do_something()




README

Code: Select all

/***************************************************************************
 *                                                                         *
 *   This program is free software; you can redistribute it and/or modify  *
 *   it under the terms of the GNU General Public License as published by  *
 *   the Free Software Foundation; either version 2 of the License, or     *
 *   (at your option) any later version.                                   *
 *                                                                         *
 ***************************************************************************/
 
 Installation:
 
 Just unpack the folder anywhere you like. It could be necessary to change the 
 mode of the two programs, pyserver.py and Tkclient.py, to executable (chmod +x *.py)
 if you want to run them using Linux.
 Then you can run both programs by typing ./programname.py options
 Otherwise typing python programname should also work

 Server:
 
 You can start pyserver in three ways:
 
 ./pyserver.py - starts a server with port 9999 to connect to
 
 ./pyserver.py xxxx - starts a server with port xxxx to connect to

 ./pyserver.py -r yyyy zzzz xxxx vvvv- starts a server and registers it to OpenGame-Cache server
                                   at adress yyyy and port zzzz and the topic xxxx (e.g. computer_chat) -
				   chat server itself is again running
				   with port vvvv open
				   
Client:

You start the client with ./Tkclient.py. A window opens and you can choose if you want to
search for a TinyChat server ("Search Server"-Button) or input the data of a chat server
directly ("Connect"-Button).
If you decide to search a server a window should open to input the host name and port
of a known OpenGameCache server. If the connection to open game cache works a list
with available registered chat servers should appear. Choose one by marking it, insert a nick name
and connect. If you used the Connect option in the first window you have to input the adress
and port of the chat server you want to connect to (you have to know that in advance in this case.
A nickname for yourself is also necessary. If the connection works you will see a chat
window showing all other chatters connected to the server on the right side. You either type
a message and send it to all other chatters by pressing the "send" button or send a privat
message to one chatter by mark her/his name and press "whisper" to send the message.
"Quit" shuts down the chat client - but I bet you supposed this already
didn't you?

OpenGameCache:

OpenGameCache is a master server program which allows web games and applications to register running
servers to. Hence, people can search for available servers by querying a OpenGameCache server.
OpenGameCache (http://bomberclone.sourceforge.net/OpenGameCache/OpenGameCache.html) is
developed by Steffen Pohle (stpohle@gmx.net).

Feedback:

I would appreciate to receive feedback about the program or any improved program versions you
may hack at pyczak@gmx.de.


pseudo_opcode
cyber messiah
cyber messiah
Posts: 1201
Joined: 30 Apr 2006, 16:00
17
Location: 127.0.0.1

Post by pseudo_opcode »

damn.. i dunno python.. Mab will have surely have something to add.. ](*,)

p99
Fame ! Where are the chicks?!
Fame ! Where are the chicks?!
Posts: 291
Joined: 14 Oct 2006, 16:00
17
Location: Some hippy's van
Contact:

Post by p99 »

Cool. Well Python is rather easy... I'm don't know any socketting... maybe I could make a thme for it though,,, it's rather bland. Needs some color.

User avatar
maboroshi
Dr. Mab
Dr. Mab
Posts: 1624
Joined: 28 Aug 2005, 16:00
18

Heya

Post by maboroshi »

Hey p99 the chat looks interesting I modified a chat similar (a lot less code though) to learn Threading

I don't know how skilled you are with Python (although python is really easy to learn) but if your looking at getting into network programming with Python and you enjoy hacking. I highly recommend Scapy

Also the twisted framework is a handy thing to learn as well

Scapy can be found here

http://www.secdev.org/projects/scapy/

and twisted can be found here

http://twistedmatrix.com/projects/core/

You probably heard of these

Scapy was a big reason why I got into Python

Cheers Maboroshi

Post Reply