Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- # -*- coding: utf-8 -*-
- from copy import deepcopy, copy
- from pdb import set_trace as st
- from os import fork, pipe, read, write, close, fdopen
- from sys import exit
- from time import sleep
- import signal
- from Queue import *
- # from Queue import Queue
- import sys
- reload(sys)
- sys.setdefaultencoding('utf8')
- class NetException(BaseException):
- pass
- class Game(object):
- def __init__(self):
- print "Game class initiated"
- self.db = []
- self.users = []
- self.MSG = {
- 0: ["Are you already registered? [y/n]: ", self._proceed_registered],
- # login
- 1: ["Type your login: ", self._proceed_get_login],
- 2: ["Type your passwd: ", self._proceed_get_password],
- 3: ["Set animal's name: ", self._proceed_select_animal],
- 10: ["Main menu: ", self._proceed_main_menu],
- }
- self.__users()
- def __users(self):
- hl = open("users", "r")
- for line in hl:
- line = line.strip()
- str = line.split("|")
- self.db.append({
- "login": str[0],
- "passwd": str[1],
- "animal": str[2]
- })
- # need we send some data to client?
- def send_to_user(self, con):
- if not self.users[self._find_user(con)]['queue'].empty():
- return self.users[self._find_user(con)]['queue'].get_nowait()
- else:
- raise NetException
- # getting exisiting user by established connection
- def _find_user(self, con):
- for i, vl in enumerate(self.users):
- if vl['sock'] == con:
- return i
- return None
- # check if user already registered?
- def _registered_user(self, login, passwd):
- for i, vl in enumerate(self.db):
- if vl['login'] == login and vl['passwd'] == passwd:
- return True
- return False
- def new_data(self, con, data):
- i = self._find_user(con)
- # forward execution to defined method of this state
- self.MSG[self.users[i]['state']][1](i, data)
- # sending message to client by new state:
- self.users[i]['queue'].put_nowait(self.MSG[self.users[i]['state']][0])
- def new_connection(self, con):
- # print connection
- self.users.append({
- "sock": con,
- "login": "",
- "passwd": "",
- "state": 0,
- "animal": "",
- "queue": Queue()
- })
- # new client is the last client, so -1 is right, i think
- self.users[-1]['queue'].put_nowait(self.MSG[0][0])
- def _proceed_registered(self, i, data):
- # print "Data: \"%s\" - \"%s\" " % (ord(data), ord('y'))
- if 'y' is data:
- self.users[i]['state'] = 1
- elif 'n' is data:
- self.users[i]['state'] = 1
- def _proceed_get_login(self, i, data):
- self.users[i]['login'] = data
- self.users[i]['state'] = 2
- def _proceed_get_password(self, i, data):
- self.users[i]['passwd'] = data
- if self._registered_user(self.users[i]['login'], self.users[i]['passwd']):
- self.users[i]['state'] = 10
- else:
- self.users[i]['state'] = 3
- def _proceed_select_animal(self, i, data):
- self.users[i]['animal'] = data
- str = "\nYour login: %s\nYour password: %s\nAnimal's name: %s\n" % (
- self.users[i]['login'],
- self.users[i]['passwd'],
- self.users[i]['animal'])
- self.users[i]['queue'].put_nowait(str)
- self.db.append({
- "login": self.users[i]['login'],
- "passwd": self.users[i]['passwd'],
- "animal": self.users[i]['animal']
- })
- self.users[i]['state'] = 10
- def _proceed_main_menu(self, i, data):
- 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