#! usr/bin/env python "Import modules from python." import os, sys import math, random "Import the pygame module." try: import pygame from pygame.locals import * except ImportError: print 'This requires PyGame. You can download it at pygame.org.' "Import pygu!" try: import pygu from pygu.locals import * except ImportError: print 'This requires PyGU.' from socket import * import socket as sock import thread, time import ConfigParser class Cursor(pygu.gui.Cursor): def __init__(self): pygu.gui.Cursor.__init__(self, False) self.image = pygu.image.load('data/Mouse Cursor.bmp', True) self.cursor = pygu.image.load('data/Mouse Cursor.bmp', True) self.cursor2 = pygu.image.load('data/Text Cursor.bmp', True) def change_type(self, type): if type == 'text': self.image = self.cursor2 if type == 'cursor': self.image = self.cursor def draw(self, surface): if pygame.mouse.get_focused(): surface.blit(self.image, (self.rect[0], self.rect[1]-8)) def now(): return time.strftime("%I:%M:%S %p",time.localtime()) def send(): global nick if window.get_widget(1).text is not "": if window.get_widget(1).text.startswith('/me'): message = str("[" + now() + "]" + " * " + nick + window.get_widget(1).text[3:]) if s.send(message): window.get_widget(1).text = "" elif window.get_widget(1).text.startswith('/nick '): oldnick = nick nick = window.get_widget(1).text[6:] sendadminote(oldnick + " is now known as " + nick) window.get_widget(1).text = "" else: message = str("[" + now() + "]" + " <" + nick + "> " + window.get_widget(1).text) if s.send(message): window.get_widget(1).text = "" def sendadminote(msg): s.sendto("[" + now() + "]" + " * " + str(msg), addr) def show_msg(msg): if not msg.startswith("New user: "): window.get_widget(0).add_message(msg) else: users.append(msg[10:]) def change_nick(): global nick oldnick = nick nick = window.get_widget(2).text if nick is not oldnick: sendadminote(oldnick + " is now known as " + nick) def ChatRead(): while 1: data = s.recv(1024) show_msg(data) print `data` #s.close() return def ChatWrite(): while 1: s.send(data) time.sleep(0.1) s.close() return def connect(): window.get_widget(0).add_message("Connecting to: " + host + " at port " + str(port)) draw() draw() s = socket(AF_INET, SOCK_STREAM) s.connect(addr) s.send("Name: " + nick) time.sleep(0.1) draw() thread.start_new(ChatRead, ()) thread.start_new(ChatWrite, ()) return s def draw(): screen.fill(BLUE_BG) window.render(screen) window.update(event) ren = font2.render("PyChat", 1, WHITE) screen.blit(ren, (256-ren.get_width()/2, -3)) ren = font.render(now(), 1, BLACK) screen.blit(ren, (451, 36)) ren = font.render(now(), 1, WHITE) screen.blit(ren, (450, 35)) ren = font.render("Msg:", 1, BLACK) screen.blit(ren, (6, 352)) ren = font.render("Msg:", 1, WHITE) screen.blit(ren, (5, 351)) ren = font.render("Nick:", 1, BLACK) screen.blit(ren, (6, 379)) ren = font.render("Nick:", 1, WHITE) screen.blit(ren, (5, 378)) screen.blit(logo, (5, 5)) cursor.update() cursor.draw(screen) pygame.display.flip() pygame.init() screen = pygu.display.screen((512, 400), 'Michael Burns - Python Powered Chat Program') font = pygu.font.Font('data/GUI Font.TTF', 8) font2 = pygu.font.Font('data/Title Font.ttf', 40) window = pygu.gui.MainWindow() window.add_widget(pygu.gui.InputBox(font=font, size=[206, 15], pos=[150, 200], fill_color=[25, 50, 125], text_color=WHITE, line_color=BLUE_BUTTON)) clock = pygame.time.Clock() cursor = Cursor() pygame.mouse.set_visible(0) logo = pygu.image.load('data/python-powered-w-100x40.png') while 1: clock.tick(60) event = pygame.event.poll() if event.type == QUIT: sys.exit() if event.type == KEYDOWN: if event.key == K_ESCAPE: pygame.quit() if event.key == K_RETURN or event.key == K_KP_ENTER: break if cursor.rect.colliderect(window.get_widget(0).rect): cursor.change_type('text') else: cursor.change_type('cursor') screen.fill(BLUE_BG) pygame.draw.rect(screen, [25, 50, 125], [90, 170, 326, 100]) pygame.draw.rect(screen, BLUE_BUTTON, [90, 170, 326, 100], 1) window.render(screen) window.update(event) ren = font2.render("PyChat", 1, WHITE) screen.blit(ren, (256-ren.get_width()/2, -3)) ren = font.render("Enter a Nickname:", 1, BLACK) screen.blit(ren, (257-ren.get_width()/2, 182)) ren = font.render("Enter a Nickname:", 1, WHITE) screen.blit(ren, (256-ren.get_width()/2, 181)) ren = font.render("Press Enter to continue", 1, BLACK) screen.blit(ren, (257-ren.get_width()/2, 226)) ren = font.render("Press Enter to continue", 1, WHITE) screen.blit(ren, (256-ren.get_width()/2, 225)) ren = font.render("Make sure you open \"Server.py\" before hitting enter.", 1, BLACK) screen.blit(ren, (257-ren.get_width()/2, 242)) ren = font.render("Make sure you open \"Server.py\" before hitting enter.", 1, WHITE) screen.blit(ren, (256-ren.get_width()/2, 241)) ren = font.render("Use \"Settings.ini\" to change the server and ports.", 1, BLACK) screen.blit(ren, (257-ren.get_width()/2, 252)) ren = font.render("Use \"Settings.ini\" to change the server and ports.", 1, WHITE) screen.blit(ren, (256-ren.get_width()/2, 251)) screen.blit(logo, (5, 5)) nick = window.get_widget(0).text cursor.update() cursor.draw(screen) pygame.display.flip() config = ConfigParser.ConfigParser() config.read("settings.ini") host = config.get("server", "host") port = int(config.get("server", "port")) # Set the socket parameters host = host port = port buf = 1024 addr = (host, port) users = [] window = pygu.gui.MainWindow() window.add_widget(pygu.gui.MessageBox(font=font, size=[502, 290], pos=[5,50], fill_color=[25, 50, 125], text_color=WHITE, line_color=BLUE_BUTTON)) window.add_widget(pygu.gui.InputBox(font=font, size=[380, 15], pos=[40, 350], fill_color=[25, 50, 125], text_color=WHITE, line_color=BLUE_BUTTON)) window.add_widget(pygu.gui.InputBox(text=nick, font=font, size=[380, 15], pos=[40, 377], fill_color=[25, 50, 125], text_color=WHITE, line_color=BLUE_BUTTON)) window.add_widget(pygu.gui.Button(text="Send", font=font, command=send, size=[75, 20], pos=[429, 348], button_color=BLUE_BUTTON)) window.add_widget(pygu.gui.Button(text="Change", font=font, command=change_nick, size=[75, 20], pos=[429, 375], button_color=BLUE_BUTTON)) def ChatRead(): while 1: data = s.recv(1024) show_msg(data) print `data` #s.close() return def ChatWrite(): while 1: s.send(data) time.sleep(0.1) s.close() return # Create socket try: window.get_widget(0).add_message("Connecting to: " + host + " at port " + str(port)) draw() draw() s = socket(AF_INET, SOCK_STREAM) s.connect(addr) s.send("Name: " + nick) window.get_widget(0).add_message("Connected to: " + host + " at port " + str(port)) time.sleep(0.1) sendadminote(nick + " joins the chat") draw() thread.start_new(ChatRead, ()) thread.start_new(ChatWrite, ()) except sock.error, (error, text): t = "ERROR: " + text window.get_widget(0).add_message(str(t)) print s while 1: clock.tick(60) event = pygame.event.poll() if event.type == QUIT: sendadminote(nick + " quit") #s.close() sys.exit() if event.type == KEYDOWN: if event.key == K_RETURN: if window.get_widget(1).selected: send() if window.get_widget(2).selected: change_nick() if cursor.rect.colliderect(window.get_widget(1).rect): cursor.change_type('text') elif cursor.rect.colliderect(window.get_widget(2).rect): cursor.change_type('text') else: cursor.change_type('cursor') draw()