Advertisement
yanirx

python Skype bot

Jul 21st, 2014
119
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 10.68 KB | None | 0 0
  1. # -*- coding: utf-8 -*-
  2. import Skype4Py
  3. import random
  4. import string
  5. import time
  6. import datetime
  7. import logging
  8. from threading import Thread
  9. from pymongo import MongoClient
  10.  
  11.  
  12. import sys
  13.  
  14. # Configuration:
  15.  
  16. mongoserver = 'localhost'
  17. mongoport = 27017
  18. logfpath = 'C:\Users\Yanir\Desktop\python\skype\chatlog.log'
  19. default_title = 'Undef'
  20.  
  21. def id_generator(size=6, chars=string.ascii_lowercase):
  22.     return ''.join(random.choice(chars) for x in range(size))
  23.  
  24. class SkypeBot():
  25.     def __init__(self):
  26.         self.skype = Skype4Py.Skype()
  27.         self.skype.Attach()
  28.         print "Attached bot to Skype client."
  29.  
  30.  
  31.         self.fwvoters = list()
  32.  
  33.         self.logger = logging.getLogger('myapp')
  34.         self.hdlr = logging.FileHandler(logfpath)
  35.         self.formatter = logging.Formatter('%(asctime)s %(levelname)s %(message)s')
  36.         self.hdlr.setFormatter(self.formatter)
  37.         self.logger.addHandler(self.hdlr)
  38.         self.logger.setLevel(20)
  39.  
  40.     #   self.client = MongoClient(mongoserver, mongoport) # MONOGDB REQUIRED
  41.     #   self.db = self.client.users
  42.     #   self.users = self.db.users
  43.  
  44.         self.ttt = TicTacToe()
  45.         self.ttton = 0
  46.         self.invited = "None"
  47.         self.inviter = "None"
  48.         self.currentturn = "None"
  49.  
  50.         self.skype.OnMessageStatus = self.MessageStatus
  51.         self.skype.FriendlyName = "Yanir"
  52.  
  53.         self.fastwrite = 0
  54.  
  55.         self.thread = Thread(target = self.waitforcmd, args=[]) # Commands thread
  56.         self.thread.start()
  57.         for g in self.skype.ActiveChats:
  58.             self.group = g
  59.  
  60.         self.topic = default_title
  61.         t = Thread(target=self.settopic, args=(1,))
  62.         t.start()
  63.  
  64.  
  65.  
  66.     def waitforcmd(self):
  67.         print "Ready for commands."
  68.         while 1:
  69.             try:
  70.                 cmd = raw_input("")
  71.             except:
  72.                 sys.exit("Error message")
  73.             else:  
  74.                 self.ProcessCommand(cmd)
  75.  
  76.     def spam(self):
  77.         while 1:
  78.             self.SendMessage("adipasimi2013")          
  79.  
  80.     def ProcessCommand(self, cmd):
  81.         cmd = cmd.lower()
  82.         if cmd == "fw":
  83.             if self.fastwrite != 0:
  84.                 print "The game is already running."
  85.             else:
  86.                 self.thread = Thread(target = self.game_fastwrite, args=[]) # Commands thread
  87.                 self.thread.start()
  88.         if cmd.startswith("settopic "):
  89.             self.group.SendMessage("Topic changed to " + cmd[9:])
  90.             self.topic = cmd[9:]
  91.         elif cmd == "t":
  92.             print "Terminating bot."
  93.             self.group.SendMessage("Closing service.")
  94.             quit()
  95.  
  96.     def game_fastwrite(self):
  97.         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!")
  98.         time.sleep(10)
  99.         self.fastwrite = random.randint(9999999, 9999999999)
  100.         fwstr = str(self.fastwrite)
  101.         self.group.SendMessage("Part 1: " + fwstr[:len(fwstr)/2])
  102.         self.group.SendMessage("Part 2: " + fwstr[len(fwstr)/2:])
  103.  
  104.     def SendMessage(self, msg):
  105.         assert str(msg)
  106.         self.group.SendMessage(msg)
  107.  
  108.     def MessageStatus(self, Message, Status):
  109.         if Message.Chat.Name != self.group.Name:
  110.             return
  111.  
  112.         if Status == Skype4Py.cmsReceived or Status == Skype4Py.cmsSent:
  113.             if Status == Skype4Py.cmsReceived:
  114.                 usr = Message.FromHandle
  115.                 disp = Message.FromDisplayName
  116.                 Message.MarkAsSeen()
  117.                 print "Message " + Message.Body + " received from user " + disp
  118.                 self.logger.info("[CHAT] " + usr + ": " + Message.Body)
  119.             else:
  120.                 usr = "yanir2461"
  121.                 disp = "yanir"
  122.                 self.logger.info("[CHAT] yanirxx: " + Message.Body)
  123.             self.ProcessMessage(Message, usr, disp)
  124.  
  125.     def ProcessMessage(self, msg, usr, disp):
  126.  
  127.         if msg.Body.startswith("#") and self.fastwrite != 0:
  128.             if self.fastwrite == int(msg.Body[1:]):
  129.                 print usr + " won the fast typing game."
  130.                 self.fastwrite = 0
  131.                 self.group.SendMessage("(*) User " + usr + " won the fast typing game! (*)")
  132.                 self.AddFWPoint(usr, disp)
  133.         if msg.Body.lower() == "!register":
  134.             self.registerUser(usr, disp)
  135.         if msg.Body.lower() == "!stats":
  136.             self.displayStats(usr, disp)
  137.         if msg.Body.lower() == "!typing":
  138.             self.voteFW(usr, disp) 
  139.         if msg.Body.lower() == "!help":
  140.             self.SendMessage("!register !stats !typing")   
  141.         if msg.Body.startswith("!ttt "):
  142.             if self.ttton == 1:
  143.                 self.SendMessage("A TicTacToe Game is already going.")
  144.                 return
  145.             self.inviteTTT(usr, disp, msg.Body[5:])
  146.         if msg.Body.lower() == "!accept":
  147.             self.acceptTTT(usr, disp)  
  148.         if msg.Body.startswith("!set "):
  149.             self.tttMove(usr, int(msg.Body[5:]))   
  150.            
  151.  
  152.     def inviteTTT(self, inviter, disp, target):
  153.         for i in self.group.ActiveMembers:
  154.             if str(i.Handle) == target:
  155.                 self.SendMessage(disp + " has invited " + target + " to play TicTacToe! (Type !accept)")
  156.                 self.inviter = inviter
  157.                 self.invited = target
  158.  
  159.     def acceptTTT(self, usr, disp):
  160.         if self.ttton == 1:
  161.             self.SendMessage("A TicTacToe Game is already going.")
  162.         print "Attempting usr- " + usr + " and: " + self.invited
  163.         if usr == self.invited:
  164.             self.SendMessage("User " + usr + "has accepted the TTT request.")
  165.             self.SendMessage("X for " + usr + ". O for " + self.inviter + ".")
  166.             self.SendMessage("Guidelines:\nType !set (1-9) to make a move.\nHost " + self.inviter + " begins.")
  167.             self.ttton = 1
  168.             self.SendMessage("Board:\n" + self.ttt.printBoard())
  169.             self.currentturn = self.inviter
  170.         else:
  171.             self.SendMessage("Can't do that.") 
  172.  
  173.     def tttMove(self, usr, num):
  174.         if num < 1 or num > 9:
  175.             self.SendMessage("Invalid number input.")
  176.             return
  177.         if self.currentturn == usr:
  178.             if not self.ttt.isEmpty(num):
  179.                 self.SendMessage("This spot is already taken!")
  180.             else:
  181.                 if self.inviter == usr:
  182.                     c = 'O'
  183.                 else:
  184.                     c = 'X'
  185.                 self.ttt.setPoint(num, c)
  186.                 if self.inviter == self.currentturn:
  187.                     self.currentturn = self.invited
  188.                 else:
  189.                     self.currentturn = self.inviter
  190.                 self.SendMessage(self.ttt.printBoard())
  191.                 if self.ttt.testWin() != None:
  192.                     if self.ttt.testWin() == 'Draw':
  193.                         self.SendMessage("Draw!")
  194.                     else:
  195.                         self.SendMessage("The winner is " + str(self.ttt.testWin()) + "! (" + usr + ")")
  196.                         self.addTTTstat(usr, 1)
  197.                         self.addTTTstat(self.currentturn, 0)
  198.                     self.ttton = 0
  199.                     self.ttt.resetBoard()
  200.                     self.inviter = "None"
  201.                     self.invited = "None"
  202.  
  203.     def addTTTstat(self, usr, wl):
  204.         dictx = self.users.find_one({"username":usr})
  205.         if dictx != None:
  206.             if not 'ttt_win' in dictx:
  207.                 dictx['ttt_win'] = 0
  208.             if not 'ttt_lose' in dictx:
  209.                 dictx['ttt_lose'] = 0  
  210.             if wl == 1:
  211.                 dictx["ttt_win"] += 1
  212.             else:
  213.                 dictx["ttt_lose"] += 1 
  214.             self.users.save(dictx)
  215.         else:
  216.             self.SendMessage(disp + " is not registered therefore he was not given points. (type !register)")                  
  217.  
  218.     def voteFW(self, usr, disp):
  219.         if usr in self.fwvoters:
  220.             self.SendMessage("You've already voted for fast typing game! (" + str(len(self.fwvoters)) + "/3)")
  221.         else:
  222.             self.fwvoters.append(usr)
  223.             if len(self.fwvoters) == 3:
  224.                 self.SendMessage("Voted for fast typing game! (3/3)")
  225.                 self.game_fastwrite()
  226.                 self.fwvoters = list()
  227.             else:
  228.                 self.SendMessage(disp + " has voted to start a fast typing game. Type !typing to vote. (" + str(len(self.fwvoters)) + "/3)")       
  229.  
  230.     def registerUser(self, usr, disp):
  231.         print "Trying to register user " + usr + "..."
  232.         if self.users.find_one({"username":usr}) != None:
  233.             self.group.SendMessage("You are already registered! (" + usr + ")")
  234.         else:
  235.             userdict = {"username":usr,
  236.                         "displayname":disp,
  237.                         "fw_won":0,
  238.                         "ttt_win":0,
  239.                         "ttt_lose":0
  240.                         }
  241.             self.users.insert(userdict)
  242.             self.group.SendMessage("Registered successfully! (" + usr + ")")
  243.             print usr + " has been registered."
  244.  
  245.     def displayStats(self, usr, disp):
  246.         keys = list(('username', 'displayname', 'fw_won', 'ttt_win', 'ttt_lose'))
  247.         stats = self.users.find_one({"username":usr})
  248.         if stats == None:
  249.             self.SendMessage("You are not registered. (" + usr + ")")
  250.         else:
  251.             for i in keys:
  252.                 if not i in stats:
  253.                     stats[i] = 0
  254.             self.users.save(stats)
  255.             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"]) + "."
  256.             self.SendMessage(statsMsg)
  257.  
  258.     def AddFWPoint(self, usr, disp):
  259.         dictx = self.users.find_one({"username":usr})
  260.         if dictx != None:
  261.             dictx["fw_won"] += 1
  262.             self.users.save(dictx)
  263.         else:
  264.             self.SendMessage(disp + " is not registered therefore he was not given points. (type !register)")  
  265.  
  266.     def settopic(self, t):
  267.         while True:
  268.             if self.group.Topic != self.topic:
  269.                 self.group._SetTopic(self.topic)
  270.             time.sleep(t)
  271.  
  272.  
  273. class TicTacToe():
  274.     def __init__(self):
  275.         self.board = [[' ' for x in xrange(3)] for x in xrange(3)]
  276.         self.board[0] = list(("1","2","3"))
  277.         self.board[1] = list(("4","5","6"))
  278.         self.board[2] = list(("7","8","9"))
  279.         self.moves = 0
  280.  
  281.     def printBoard(self):
  282.         lx = list()
  283.         for i in self.board:
  284.             lx.append(i[0] + " | " + i[1] + " | " + i[2] + '\n')
  285.         return ''.join(lx)
  286.  
  287.     def numToArray(self, num):
  288.         if num >= 1 and num <= 3:
  289.             x = 0
  290.         elif num >= 4 and num <= 6:
  291.             x = 1
  292.         else:
  293.             x = 2
  294.  
  295.         if num == 1 or num == 4 or num == 7:
  296.             y = 0
  297.         elif num == 2 or num == 5 or num == 8:
  298.             y = 1
  299.         else:
  300.             y = 2  
  301.         return x,y     
  302.  
  303.     def testWin(self):
  304.         if self.board[0].count('X')  == 3 or self.board[1].count('X') == 3 or self.board[2].count('X') == 3:
  305.             return 'X'
  306.         if self.board[0].count('O') == 3 or self.board[1].count('O') == 3 or self.board[2].count('O') == 3:
  307.             return 'O'
  308.  
  309.         if (self.board[0][0] == self.board[1][0] == self.board[2][0]) and self.board[0][0] != ' ':
  310.             return self.board[0][0]
  311.         if self.board[0][1] == self.board[1][1] == self.board[2][1]:
  312.             if self.board[0][1] != ' ':
  313.                 return self.board[0][1]
  314.         if self.board[0][2] == self.board[1][2] == self.board[2][2]:
  315.             if self.board[0][2] != ' ':
  316.                 return self.board[0][2]
  317.  
  318.         if self.board[0][0] == self.board[1][1] == self.board[2][2]:
  319.             if self.board[0][0] != ' ':
  320.                 return self.board[1][1]
  321.         if self.board[0][2] == self.board[1][1] == self.board[2][0]:
  322.             if self.board[0][2] != ' ':
  323.                 return self.board[1][1]
  324.  
  325.         for i in self.board:
  326.             for j in i:
  327.                 if j != 'X' and j != 'O':
  328.                     return None
  329.  
  330.         return 'Draw'
  331.  
  332.     def isEmpty(self, num):
  333.         x,y = self.numToArray(num)
  334.         if self.board[x][y] != 'X' and self.board[x][y] != 'O':
  335.             return True
  336.         return False   
  337.  
  338.     def resetBoard(self):
  339.         self.board = [[' ' for x in xrange(3)] for x in xrange(3)]
  340.         self.moves = 0
  341.         self.board[0] = list(("1","2","3"))
  342.         self.board[1] = list(("4","5","6"))
  343.         self.board[2] = list(("7","8","9"))
  344.  
  345.     def setPoint(self, num, char):
  346.         if not self.isEmpty(num):
  347.             return False
  348.         assert self.moves < 9
  349.         x,y = self.numToArray(num)
  350.         self.moves += 1
  351.         self.board[x][y] = char
  352.         print "board " + str(x) + "," + str(y) + " set to " + char 
  353.  
  354.  
  355. bot = SkypeBot()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement