Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- # -*- coding: utf-8 -*-
- import Skype4Py
- import random
- import string
- import time
- import datetime
- import logging
- from threading import Thread
- from pymongo import MongoClient
- import sys
- # Configuration:
- mongoserver = 'localhost'
- mongoport = 27017
- logfpath = 'C:\Users\Yanir\Desktop\python\skype\chatlog.log'
- default_title = 'Undef'
- def id_generator(size=6, chars=string.ascii_lowercase):
- return ''.join(random.choice(chars) for x in range(size))
- class SkypeBot():
- def __init__(self):
- self.skype = Skype4Py.Skype()
- self.skype.Attach()
- print "Attached bot to Skype client."
- self.fwvoters = list()
- self.logger = logging.getLogger('myapp')
- self.hdlr = logging.FileHandler(logfpath)
- self.formatter = logging.Formatter('%(asctime)s %(levelname)s %(message)s')
- self.hdlr.setFormatter(self.formatter)
- self.logger.addHandler(self.hdlr)
- self.logger.setLevel(20)
- # self.client = MongoClient(mongoserver, mongoport) # MONOGDB REQUIRED
- # self.db = self.client.users
- # self.users = self.db.users
- self.ttt = TicTacToe()
- self.ttton = 0
- self.invited = "None"
- self.inviter = "None"
- self.currentturn = "None"
- self.skype.OnMessageStatus = self.MessageStatus
- self.skype.FriendlyName = "Yanir"
- self.fastwrite = 0
- self.thread = Thread(target = self.waitforcmd, args=[]) # Commands thread
- self.thread.start()
- for g in self.skype.ActiveChats:
- self.group = g
- self.topic = default_title
- t = Thread(target=self.settopic, args=(1,))
- t.start()
- def waitforcmd(self):
- print "Ready for commands."
- while 1:
- try:
- cmd = raw_input("")
- except:
- sys.exit("Error message")
- else:
- self.ProcessCommand(cmd)
- def spam(self):
- while 1:
- self.SendMessage("adipasimi2013")
- def ProcessCommand(self, cmd):
- cmd = cmd.lower()
- if cmd == "fw":
- if self.fastwrite != 0:
- print "The game is already running."
- else:
- self.thread = Thread(target = self.game_fastwrite, args=[]) # Commands thread
- self.thread.start()
- if cmd.startswith("settopic "):
- self.group.SendMessage("Topic changed to " + cmd[9:])
- self.topic = cmd[9:]
- elif cmd == "t":
- print "Terminating bot."
- self.group.SendMessage("Closing service.")
- quit()
- def game_fastwrite(self):
- self.group.SendMessage("The bot has initiated fast typing game!\nA number will be sent in 10 seconds, first one to type it out wins!\nUse # in the beginning of your message!\n*** The number will come in two different messages but you need to put the numbers together!")
- time.sleep(10)
- self.fastwrite = random.randint(9999999, 9999999999)
- fwstr = str(self.fastwrite)
- self.group.SendMessage("Part 1: " + fwstr[:len(fwstr)/2])
- self.group.SendMessage("Part 2: " + fwstr[len(fwstr)/2:])
- def SendMessage(self, msg):
- assert str(msg)
- self.group.SendMessage(msg)
- def MessageStatus(self, Message, Status):
- if Message.Chat.Name != self.group.Name:
- return
- if Status == Skype4Py.cmsReceived or Status == Skype4Py.cmsSent:
- if Status == Skype4Py.cmsReceived:
- usr = Message.FromHandle
- disp = Message.FromDisplayName
- Message.MarkAsSeen()
- print "Message " + Message.Body + " received from user " + disp
- self.logger.info("[CHAT] " + usr + ": " + Message.Body)
- else:
- usr = "yanir2461"
- disp = "yanir"
- self.logger.info("[CHAT] yanirxx: " + Message.Body)
- self.ProcessMessage(Message, usr, disp)
- def ProcessMessage(self, msg, usr, disp):
- if msg.Body.startswith("#") and self.fastwrite != 0:
- if self.fastwrite == int(msg.Body[1:]):
- print usr + " won the fast typing game."
- self.fastwrite = 0
- self.group.SendMessage("(*) User " + usr + " won the fast typing game! (*)")
- self.AddFWPoint(usr, disp)
- if msg.Body.lower() == "!register":
- self.registerUser(usr, disp)
- if msg.Body.lower() == "!stats":
- self.displayStats(usr, disp)
- if msg.Body.lower() == "!typing":
- self.voteFW(usr, disp)
- if msg.Body.lower() == "!help":
- self.SendMessage("!register !stats !typing")
- if msg.Body.startswith("!ttt "):
- if self.ttton == 1:
- self.SendMessage("A TicTacToe Game is already going.")
- return
- self.inviteTTT(usr, disp, msg.Body[5:])
- if msg.Body.lower() == "!accept":
- self.acceptTTT(usr, disp)
- if msg.Body.startswith("!set "):
- self.tttMove(usr, int(msg.Body[5:]))
- def inviteTTT(self, inviter, disp, target):
- for i in self.group.ActiveMembers:
- if str(i.Handle) == target:
- self.SendMessage(disp + " has invited " + target + " to play TicTacToe! (Type !accept)")
- self.inviter = inviter
- self.invited = target
- def acceptTTT(self, usr, disp):
- if self.ttton == 1:
- self.SendMessage("A TicTacToe Game is already going.")
- print "Attempting usr- " + usr + " and: " + self.invited
- if usr == self.invited:
- self.SendMessage("User " + usr + "has accepted the TTT request.")
- self.SendMessage("X for " + usr + ". O for " + self.inviter + ".")
- self.SendMessage("Guidelines:\nType !set (1-9) to make a move.\nHost " + self.inviter + " begins.")
- self.ttton = 1
- self.SendMessage("Board:\n" + self.ttt.printBoard())
- self.currentturn = self.inviter
- else:
- self.SendMessage("Can't do that.")
- def tttMove(self, usr, num):
- if num < 1 or num > 9:
- self.SendMessage("Invalid number input.")
- return
- if self.currentturn == usr:
- if not self.ttt.isEmpty(num):
- self.SendMessage("This spot is already taken!")
- else:
- if self.inviter == usr:
- c = 'O'
- else:
- c = 'X'
- self.ttt.setPoint(num, c)
- if self.inviter == self.currentturn:
- self.currentturn = self.invited
- else:
- self.currentturn = self.inviter
- self.SendMessage(self.ttt.printBoard())
- if self.ttt.testWin() != None:
- if self.ttt.testWin() == 'Draw':
- self.SendMessage("Draw!")
- else:
- self.SendMessage("The winner is " + str(self.ttt.testWin()) + "! (" + usr + ")")
- self.addTTTstat(usr, 1)
- self.addTTTstat(self.currentturn, 0)
- self.ttton = 0
- self.ttt.resetBoard()
- self.inviter = "None"
- self.invited = "None"
- def addTTTstat(self, usr, wl):
- dictx = self.users.find_one({"username":usr})
- if dictx != None:
- if not 'ttt_win' in dictx:
- dictx['ttt_win'] = 0
- if not 'ttt_lose' in dictx:
- dictx['ttt_lose'] = 0
- if wl == 1:
- dictx["ttt_win"] += 1
- else:
- dictx["ttt_lose"] += 1
- self.users.save(dictx)
- else:
- self.SendMessage(disp + " is not registered therefore he was not given points. (type !register)")
- def voteFW(self, usr, disp):
- if usr in self.fwvoters:
- self.SendMessage("You've already voted for fast typing game! (" + str(len(self.fwvoters)) + "/3)")
- else:
- self.fwvoters.append(usr)
- if len(self.fwvoters) == 3:
- self.SendMessage("Voted for fast typing game! (3/3)")
- self.game_fastwrite()
- self.fwvoters = list()
- else:
- self.SendMessage(disp + " has voted to start a fast typing game. Type !typing to vote. (" + str(len(self.fwvoters)) + "/3)")
- def registerUser(self, usr, disp):
- print "Trying to register user " + usr + "..."
- if self.users.find_one({"username":usr}) != None:
- self.group.SendMessage("You are already registered! (" + usr + ")")
- else:
- userdict = {"username":usr,
- "displayname":disp,
- "fw_won":0,
- "ttt_win":0,
- "ttt_lose":0
- }
- self.users.insert(userdict)
- self.group.SendMessage("Registered successfully! (" + usr + ")")
- print usr + " has been registered."
- def displayStats(self, usr, disp):
- keys = list(('username', 'displayname', 'fw_won', 'ttt_win', 'ttt_lose'))
- stats = self.users.find_one({"username":usr})
- if stats == None:
- self.SendMessage("You are not registered. (" + usr + ")")
- else:
- for i in keys:
- if not i in stats:
- stats[i] = 0
- self.users.save(stats)
- statsMsg = "Stats for " + disp + ":\nSkype username: " + usr +"\nFast-typings won: " + str(stats["fw_won"]) + "\n[TTT] W: " + str(stats["ttt_win"]) + " | L: " + str(stats["ttt_lose"]) + "."
- self.SendMessage(statsMsg)
- def AddFWPoint(self, usr, disp):
- dictx = self.users.find_one({"username":usr})
- if dictx != None:
- dictx["fw_won"] += 1
- self.users.save(dictx)
- else:
- self.SendMessage(disp + " is not registered therefore he was not given points. (type !register)")
- def settopic(self, t):
- while True:
- if self.group.Topic != self.topic:
- self.group._SetTopic(self.topic)
- time.sleep(t)
- class TicTacToe():
- def __init__(self):
- self.board = [[' ' for x in xrange(3)] for x in xrange(3)]
- self.board[0] = list(("1","2","3"))
- self.board[1] = list(("4","5","6"))
- self.board[2] = list(("7","8","9"))
- self.moves = 0
- def printBoard(self):
- lx = list()
- for i in self.board:
- lx.append(i[0] + " | " + i[1] + " | " + i[2] + '\n')
- return ''.join(lx)
- def numToArray(self, num):
- if num >= 1 and num <= 3:
- x = 0
- elif num >= 4 and num <= 6:
- x = 1
- else:
- x = 2
- if num == 1 or num == 4 or num == 7:
- y = 0
- elif num == 2 or num == 5 or num == 8:
- y = 1
- else:
- y = 2
- return x,y
- def testWin(self):
- if self.board[0].count('X') == 3 or self.board[1].count('X') == 3 or self.board[2].count('X') == 3:
- return 'X'
- if self.board[0].count('O') == 3 or self.board[1].count('O') == 3 or self.board[2].count('O') == 3:
- return 'O'
- if (self.board[0][0] == self.board[1][0] == self.board[2][0]) and self.board[0][0] != ' ':
- return self.board[0][0]
- if self.board[0][1] == self.board[1][1] == self.board[2][1]:
- if self.board[0][1] != ' ':
- return self.board[0][1]
- if self.board[0][2] == self.board[1][2] == self.board[2][2]:
- if self.board[0][2] != ' ':
- return self.board[0][2]
- if self.board[0][0] == self.board[1][1] == self.board[2][2]:
- if self.board[0][0] != ' ':
- return self.board[1][1]
- if self.board[0][2] == self.board[1][1] == self.board[2][0]:
- if self.board[0][2] != ' ':
- return self.board[1][1]
- for i in self.board:
- for j in i:
- if j != 'X' and j != 'O':
- return None
- return 'Draw'
- def isEmpty(self, num):
- x,y = self.numToArray(num)
- if self.board[x][y] != 'X' and self.board[x][y] != 'O':
- return True
- return False
- def resetBoard(self):
- self.board = [[' ' for x in xrange(3)] for x in xrange(3)]
- self.moves = 0
- self.board[0] = list(("1","2","3"))
- self.board[1] = list(("4","5","6"))
- self.board[2] = list(("7","8","9"))
- def setPoint(self, num, char):
- if not self.isEmpty(num):
- return False
- assert self.moves < 9
- x,y = self.numToArray(num)
- self.moves += 1
- self.board[x][y] = char
- print "board " + str(x) + "," + str(y) + " set to " + char
- bot = SkypeBot()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement