#!/usr/bin/env python #-*- coding:utf-8 -*- import socket import pprint import threading import SocketServer import random import signal import time from sets import Set as set from sys import stdout, stderr from os import fork, chdir, setsid, umask RAND_MAX = (2 ** 20) PICK_SIZE = 5 MAX_READ = 128 LOTTO_GRID_SIZE = 299 SESSION_LIMIT_TIME = 30 MAX_PICK_CHANGES = 5 WINNER_CHECK_FUNCTION = 'self.checkWinners' class ForkedTCPRequestHandler(): __module__ = __name__ lotto_grid = None connstream_fobj = None def setup(self): signal.signal(signal.SIGALRM, self.handleSessionTimeout) signal.alarm(SESSION_LIMIT_TIME) def handleSessionTimeout(self, signum, frame): raise socket.timeout def createWinners(self): winners = set() while (len(winners) < PICK_SIZE): winners.update([random.randint(1, RAND_MAX)]) return winners def pickRandom(self): picks = set() llen = len(self.lotto_grid) rand_base = (len(picks) - 1) while (len(picks) < PICK_SIZE): i = random.randint(rand_base, RAND_MAX) if (i < 1): ++i if ((i > llen) and ((i % llen) == 0)): i += 1 i = (i % llen) picks.update([i]) return picks def genGrid(self): grid = [WINNER_CHECK_FUNCTION] while (len(grid) != LOTTO_GRID_SIZE): grid.append(random.randint(0, RAND_MAX)) return grid def checkWinners(self, element): winner = True for n in self.winners: print "WINNER:",n; print str([ self.lotto_grid[p] for p in self.pick_list ]) winner = (winner & (n in [ self.lotto_grid[p] for p in self.pick_list ])) if winner: self.request.send('ZOMG You won!!!\n') else: self.request.send("Sorry you aren't very lucky... Maybe you have better luck with women?\n") def playGame(self): self.request.send('Thanks for your choices, calculating if you won...') eval(self.lotto_grid[0])(self.lotto_grid[1:]) def getLine(self, msg): self.request.send(msg) return self.connstream_fobj.readline(MAX_READ) def handlePickChange(self): for r in range(0, MAX_PICK_CHANGES): input = self.getLine('Input the number of the pick that you wish to change or newline to stop:\n') if (input.strip() == ''): break else: idx_to_edit = int(input) l = self.getLine('Input your new pick\n') self.lotto_grid[self.pick_list[idx_to_edit]] = l def handle(self): #rand_seed = self.request.getpeername()[1] #self.connstream_fobj = self.request.makefile() #print "SEED:",rand_seed for i in range(1, 65536): if i % 1000 == 0: print i random.seed(i) #self.request.send('Welcome to lottod good luck!\n') self.lotto_grid = self.genGrid() self.pick_list = list(self.pickRandom()) if 0 in self.pick_list: print i, str(self.pick_list) print "END" return self.winners = self.createWinners() self.request.send('Your random picks are:\n') for pick_idx in range(0, PICK_SIZE): self.request.send(('%d. %s\n' % (pick_idx, self.lotto_grid[self.pick_list[pick_idx]]))) self.handlePickChange() self.playGame() class ForkedTCPServer(SocketServer.ForkingMixIn, SocketServer.TCPServer): __module__ = __name__ timeout = 50000 request_queue_size = 10 def runServer(): (HOST, PORT,) = ('0.0.0.0', 10024) #server = ForkedTCPServer((HOST, PORT), ForkedTCPRequestHandler) print 'Time:', time.localtime() server = ForkedTCPRequestHandler() server.handle() def doFork(n): try: pid = fork() if ((pid > 0) and (n > 0)): print ('Lottod PID %d' % pid) if (pid > 0): exit(0) except OSError, e: print ('Fork %d failed %d (%s)' % (n, e.errno, e.strerror)) exit(1) if (__name__ == '__main__'): #doFork(0) #chdir('/') #setsid() umask(0) #doFork(1) runServer()