Chatter

An irc-like chat program

import socket
import threading
import ConfigParser
import os

Online_Users   = []
Client_Objects = []


#==================================================================================================
class Server():                                 #
#===============================================#
	def __init__(self, port):
		self._PORT = port
		self._socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
#================================================
	def start(self):
		self._socket.bind(('', self._PORT))
		self._socket.listen(3)
		while True:
			self._client, self._address = self._socket.accept()
			self._handler = Client_Handler(self._client, self._address)
			self._handler.start()
#==================================================================================================


#==================================================================================================
class Sender(threading.Thread):                 #
#===============================================#
	def __init__(self, port):
		threading.Thread.__init__(self)
		self._port = port
		global Client_Objects
#================================================
	def all(self, string):
		self._message = string
		for self._client in Client_Objects:
			print self._client
			try:
				self._client.send(self._message)
			except:
				print "ERR: No Clients connected!"
#================================================
	def private(self, user, string):
		self._message = string
		self._clientobj = Get_Obj(user)
		self._clientobj.send(self._message)
#==================================================================================================


#==================================================================================================
class Client_Handler(threading.Thread):         #
#===============================================#
	def __init__(self, client, address):
		threading.Thread.__init__(self)
		self._clientobj = client
		print self._clientobj
		self._address = address
		global Online_Users
		global Client_Objects
#================================================
	def run(self):
		self._username = self._clientobj.recv(1024)
		if Allow_duplicate_usernames == False:
			while Check_Availability(self._username) == False:
				self._clientobj.send("1")
				self._username = self._clientobj.recv(1024)
		sender.all(self._username + " joined the channel.")
		Online_Users.append(self._username)
		Client_Objects.append(self._clientobj)
		self._clientobj.send("0")
		self._clientobj.send(Welcome_message)
		while True:
			self._message = self._clientobj.recv(1024)
			Evaluate(self._username, self._message, self._clientobj)
#==================================================================================================


#================================================
def Evaluate(username, message, clientobj):
	mList = message.split(".")
	if mList[0] == None:
		pass
	elif mList[0] == "PMSG":
		msg = "[PM]" + username + mList[2]
		sender.private(mList[2], msg)
	elif mList[0] == "QUIT":
		sender.all(username + " left the channel.")
		Online_Users.remove(username)
		Client_Objects.remove(clientobj)
	else:
		sender.all(username + ":" + message)
#================================================
def ParseConfig():
	config = ConfigParser.RawConfigParser()
	config.read("chatterd.conf")
	global PORT
	#global Operator_List
	global Allow_duplicate_usernames
	global Welcome_message
	PORT = config.getint("Server Settings", "port")
	#Operator_List = config.get("User Settings", "operators").split()
	Allow_duplicate_usernames = config.getboolean("User Settings", "Allow_duplicate_usernames")
	Welcome_message = config.get("Server Settings", "Welcome_message")
#================================================
def GenerateConfig():
	header = "# This config file was automatically generated with the default settings. Feel free to change any at all, but\n# keep the same types. In [User Settings] 'Operators' can be more than one username seperated by a space.\n\n"
	config = ConfigParser.RawConfigParser()
	config.add_section("Server Settings")
	config.set("Server Settings", "port", "1337")
	config.set("Server Settings", "Welcome_message", "Welcome to Chatter v0.2!")
	config.add_section("User Settings")
	#config.set("User Settings", "operators", "Administrator")
	config.set("User Settings", "Allow_duplicate_usernames", "False")
	with open("chatterd.conf", 'a') as confFile:
		confFile.write(header)
		config.write(confFile)
#================================================
def Check_Availability(username):
	if username in Online_Users:
		return False
	else:
		return True
#================================================
def Get_Obj(username):
	index = Online_Users.index(username)
	return Client_Objects[index]
#================================================

if not os.path.exists("chatterd.conf"):
	GenerateConfig()
ParseConfig()
server = Server(PORT)
sender = Sender(PORT)
server.start()