Advertisement
Bkmz

Untitled

Apr 10th, 2012
61
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 4.01 KB | None | 0 0
  1. # -*- coding: utf-8 -*-
  2. from copy import deepcopy, copy
  3. from pdb import set_trace as st
  4.  
  5. from os import fork, pipe, read, write, close, fdopen
  6. from sys import exit
  7.  
  8. from time import sleep
  9.  
  10. import signal
  11.  
  12. from Queue import *
  13.  
  14. # from Queue import Queue
  15.  
  16. import sys
  17. reload(sys)
  18. sys.setdefaultencoding('utf8')
  19.  
  20. class NetException(BaseException):
  21.     pass
  22.  
  23. class Game(object):
  24.    
  25.  
  26.     def __init__(self):
  27.         print "Game class initiated"
  28.         self.db = []
  29.         self.users = []
  30.         self.MSG = {
  31.             0: ["Are you already registered? [y/n]: ", self._proceed_registered],
  32.             # login
  33.             1: ["Type your login: ", self._proceed_get_login],
  34.             2: ["Type your passwd: ", self._proceed_get_password],
  35.  
  36.             3: ["Set animal's name: ", self._proceed_select_animal],
  37.  
  38.             10: ["Main menu: ", self._proceed_main_menu],
  39.         }
  40.  
  41.         self.__users()
  42.  
  43.     def __users(self):
  44.         hl = open("users", "r")
  45.         for line in hl:
  46.             line = line.strip()
  47.             str = line.split("|")
  48.  
  49.             self.db.append({
  50.                 "login": str[0],
  51.                 "passwd": str[1],
  52.                 "animal": str[2]
  53.                 })
  54.  
  55.     # need we send some data to client?
  56.     def send_to_user(self, con):
  57.         if not self.users[self._find_user(con)]['queue'].empty():
  58.             return self.users[self._find_user(con)]['queue'].get_nowait()
  59.         else:
  60.             raise NetException
  61.  
  62.  
  63.     # getting exisiting user by established connection
  64.     def _find_user(self, con):
  65.         for i, vl in enumerate(self.users):
  66.             if vl['sock'] == con:
  67.                 return i
  68.  
  69.         return None
  70.  
  71.     # check if user already registered?
  72.     def _registered_user(self, login, passwd):
  73.         for i, vl in enumerate(self.db):
  74.             if vl['login'] == login and vl['passwd'] == passwd:
  75.                 return True
  76.         return False
  77.  
  78.  
  79.     def new_data(self, con, data):
  80.         i = self._find_user(con)
  81.         # forward execution to defined method of this state
  82.         self.MSG[self.users[i]['state']][1](i, data)
  83.  
  84.         # sending message to client by new state:
  85.         self.users[i]['queue'].put_nowait(self.MSG[self.users[i]['state']][0])
  86.  
  87.  
  88.     def new_connection(self, con):
  89.         # print connection
  90.         self.users.append({
  91.             "sock": con,
  92.             "login": "",
  93.             "passwd": "",
  94.             "state": 0,
  95.             "animal": "",
  96.             "queue": Queue()
  97.         })
  98.  
  99.         # new client is the last client, so -1 is right, i think
  100.         self.users[-1]['queue'].put_nowait(self.MSG[0][0])
  101.  
  102.     def _proceed_registered(self, i, data):
  103.         # print "Data: \"%s\" - \"%s\" " % (ord(data), ord('y'))
  104.         if 'y' is data:
  105.             self.users[i]['state'] = 1
  106.         elif 'n' is data:
  107.             self.users[i]['state'] = 1
  108.  
  109.        
  110.  
  111.     def _proceed_get_login(self, i, data):
  112.         self.users[i]['login'] = data
  113.         self.users[i]['state'] = 2
  114.  
  115.     def _proceed_get_password(self, i, data):
  116.         self.users[i]['passwd'] = data
  117.  
  118.         if self._registered_user(self.users[i]['login'], self.users[i]['passwd']):
  119.             self.users[i]['state'] = 10
  120.         else:
  121.             self.users[i]['state'] = 3
  122.            
  123.  
  124.  
  125.  
  126.     def _proceed_select_animal(self, i, data):
  127.  
  128.         self.users[i]['animal'] = data
  129.  
  130.         str = "\nYour login: %s\nYour password: %s\nAnimal's name: %s\n" % (
  131.                 self.users[i]['login'],
  132.                 self.users[i]['passwd'],
  133.                 self.users[i]['animal'])
  134.  
  135.         self.users[i]['queue'].put_nowait(str)
  136.  
  137.         self.db.append({
  138.                 "login": self.users[i]['login'],
  139.                 "passwd": self.users[i]['passwd'],
  140.                 "animal": self.users[i]['animal']
  141.             })
  142.  
  143.         self.users[i]['state'] = 10
  144.  
  145.  
  146.     def _proceed_main_menu(self, i, data):
  147.         self.users[i]['queue'].put_nowait("\nType 1 for get state\n2 for feed\n3 for play\n")
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement