All pastes #807795 Raw Edit

Anonymous

public text v1 · immutable
·published 2007-12-07 00:36 UTC
rendered paste body
#### CONFIG FILE ####
[server]
port: 4560

host: localhost


### CODE ####


#! usr/bin/env python



"Import modules from python." 

import os, sys

import math, random

import ConfigParser


"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



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 = config.get("server", "port")





# Set the socket parameters

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()