Advertisement
Guest User

Untitled

a guest
Jul 10th, 2017
82
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 18.91 KB | None | 0 0
  1. from __future__ import division
  2. from math import ceil
  3. from twisted.words.protocols import irc
  4. from twisted.internet import protocol
  5. from twisted.internet import reactor
  6. import random
  7.  
  8. #update votes etc if a player leaves
  9. #update votes etc on a nick change
  10.  
  11. #mlock the modes, set +v the sexy way ie +vvvvvvvvv
  12. #give owner more privs, such as forceing votes, forcing leaves etc, maybe give half op so can kick faggots
  13. #start >lynch command
  14. #read commands, descriptions etc from a xml file
  15. #fix bugs and tidy code
  16. #update dict.get maybe
  17.  
  18. oper_pass = ''
  19. ns_pass = ''
  20.  
  21. min_players = 3
  22. min_players_2_wolves = 6
  23.  
  24. #info make loadable from xml in another class etc
  25.  
  26. roles = {1:'Nigger',2:'Cop',3:'Housewife'}
  27.  
  28. commands = {'lynch':'>lynch','see':'>raid','kill':'>rape'}
  29.  
  30. roles_left = {1:'They left behind a empty bucket of kfc and a half eaten watermelon.',
  31.             2:'They left behind a empty box of donuts.',
  32.             3:'Nothing of value was lost.'}
  33.  
  34. roles_objective = {1:'Your objective is to blend in with the rest of suburbia, once a night,',
  35.                         2:'Your objective is to determine the identity of any %s hiding in suburbia, once a night,' % roles.get(1,None),
  36.                         3:'Your objective is to decide upon who you think is a %s.' % roles.get(1,None)
  37.                 }
  38.                
  39. #role is reminded at night, maybe sca
  40. roles_ability = {1:'you must use %s TARGET to rape a housewife.' % commands.get('kill',None),
  41.             2:'you must use %s TARGET to determine the targets real identity.' % commands.get('see',None),
  42.             3:'Try not to get raped'
  43.             }
  44.  
  45.  
  46. night_end = 'The night has ended, suburbia awakens to find the dead raped body of:'
  47. night_begin = 'Night time begins in suburbia, niggery is afoot'
  48.  
  49. cant_kill_self = 'You cannot rape yourself.'
  50. cant_kill_wolf = 'You cannot rape another nigger.'
  51.  
  52. cant_see_self = 'You cannot raid yourself'
  53.  
  54. enough_2_wolves = 'There are enough players for 2 niggers'
  55. two_wolves = 'There are two niggers in this game the other nigger is:'
  56.  
  57. lynch_begin = 'Suburbia has made its decision, and has decided to lynch:'
  58.  
  59. #do the even thing? going with determining what roles are left, for added lulz and dickery
  60. wolf_win = 'Suburbia has been thoroughly raped, niggers rein supreme... there goes the neighborhood.'
  61. village_win = 'Suburbia has been saved and is now rid of all niggers, the suburban dream is safe... for now.'
  62.  
  63. class WolfBot(irc.IRCClient):
  64.    
  65.     def _get_nickname(self):
  66.         return self.factory.nickname
  67.    
  68.     nickname = property(_get_nickname)
  69.  
  70.     def signedOn(self):
  71.         self.sendLine('OPER %s' % oper_pass)
  72.         self.mode(self.factory.nickname,True,'BH',None,None,None)
  73.         self.msg('Nickserv','id %s' % ns_pass)
  74.         self.msg('Operserv', 'set superadmin on')
  75.         self.join(self.factory.channel)
  76.        
  77.     def player_gone(self,user,channel):
  78.         if self.game_schedule:
  79.             del self.players[user]
  80.             self.msg(channel,'%s just dissapeard, nothing of value was lost' % user)
  81.         elif self.game:
  82.             role_num = self.players.get(user, None)
  83.             del self.players[user]
  84.             self.msg(channel,'%s just dissapeard, %s was a %s, %s' % (user,user,roles[role_num],roles_left[role_num]))
  85.             if role_num == 1:
  86.                 self.wolves.remove(user)
  87.                 if self.wolves and not self.lynch_time:
  88.                     del self.wolf_targets[user]
  89.                     self.wolf_target = None
  90.                     self.killed = False
  91.                     #means there was 2, one remains.
  92.                     other_wolf = self.wolves[0]
  93.                     if self.wolf_targets[other_wolf] == None:
  94.                         self.msg(other_wolf,'Your fellow %s %s has dissapeard, continue choosing your target' % (roles[1],user))
  95.                     else:
  96.                         self.msg(other_wolf,'Your fellow %s %s has dissapeard, confirm your target' % (roles[1],user))
  97.  
  98.             elif role_num == 2:
  99.                 self.seer = None
  100.  
  101.             if not self.check_winner(channel):
  102.                 if not self.lynch_time:
  103.                     #fix wolf target dissapearing
  104.                     if user == self.wolf_target or user in self.wolf_targets.values(): #hope dont throw error
  105.                         self.killed = False
  106.                         self.wolf_target = None
  107.                         if len(self.wolves) == 2:
  108.                             for k, v in self.wolf_targets.iteritems():
  109.                                 if v == user:
  110.                                     self.wolf_targets[k] = None
  111.                                     self.msg(k,'Your target of choice has dissapeard, select a new target')
  112.                         else:
  113.                             self.msg(self.wolves[0],'Your target of choice has dissapeard, select a new target')
  114.                            
  115.                 else:
  116.                     #fix votes here
  117.                     if user in self.not_voted:
  118.                         self.not_voted.remove(user)
  119.                     else:
  120.                         #lower the person who they voted fors tally:
  121.                         self.vote_dict[self.player_vote[user]] -= 1
  122.                         del self.player_vote[user]
  123.                     #give the people who voted for user their vote back and append them to self.not_voted, remove them from vote_dict
  124.                     if self.vote_dict[user] > 0:
  125.                         #could listcomp it
  126.                         people = []
  127.                         for k, v in self.player_vote.iteritems():
  128.                             if v == user:
  129.                                 #give the people who voted for user there vote back, and inform them/channel
  130.                                 self.not_voted.append(k)
  131.                                 people.append[k]
  132.                                 self.player_vote[k] = None #bad?
  133.                         self.msg(channel,'Because %s dissapeard, the following people who voted for them, must vote again: %s' % (user,', '.join(people)) )
  134.  
  135.                     del self.vote_dict[user]
  136.                     #lower self.majority
  137.                     self.majority -= 1
  138.    
  139.         if user == self.owner: #need to tie this in with line 101 somehow
  140.             self.owner = random.choice(self.players.keys())
  141.             self.msg(channel,'%s was the game owner, %s has become the owner now' % (user,self.owner))
  142.            
  143.         #self.check_winner
  144.    
  145.     def assign_roles(self,channel):
  146.         if len(self.players) >= min_players_2_wolves:
  147.             self.msg(channel,enough_2_wolves)
  148.             self.wolves = random.sample(self.players.keys(),3)
  149.         else:
  150.             self.wolves = random.sample(self.players.keys(),2)
  151.        
  152.         self.seer = random.choice(self.wolves)
  153.         self.wolves.remove(self.seer)
  154.        
  155.         self.mode(channel,True,'m',None,None,None)
  156.        
  157.         for player in self.players.keys():
  158.             self.mode(channel,True,'v',None,player,None)
  159.             if player == self.seer:
  160.                 self.players[player] = 2
  161.             elif player in self.wolves:
  162.                 self.players[player] = 1
  163.             else:
  164.                 self.players[player] = 3
  165.             role_num = self.players.get(player, None)
  166.             self.msg(player,'You are a %s. %s' % (roles[role_num],roles_objective[role_num]))
  167.        
  168.         self.night_begin()
  169.        
  170.     def night_begin(self):
  171.         self.owner_force = False
  172.         self.lynch_time = False
  173.         self.killed = False
  174.         if self.seer:
  175.             self.seen = False
  176.         else:
  177.             self.seen = True
  178.         for player, role_num in self.players.iteritems():
  179.             self.msg(player,roles_ability.get(role_num,None))
  180.             if role_num == 1 and len(self.wolves) == 2:
  181.                 self.msg(player,'%s %s, you must agree on the same targets.' % (two_wolves,self.get_other_wolf(player)))
  182.  
  183.         self.msg(self.factory.channel,night_begin)
  184.        
  185.     def check_night_finished(self):
  186.         if self.seen and self.killed:
  187.             self.mode(self.factory.channel,False,'v',None,self.wolf_target,None)
  188.             self.msg(self.factory.channel,'%s %s' % (night_end, self.wolf_target))
  189.             role_num = self.players[self.wolf_target]
  190.             self.msg(self.factory.channel,'%s was a %s. %s' % (self.wolf_target,roles[role_num],roles_left[role_num]))
  191.            
  192.             self.dead.append(self.wolf_target)
  193.             del self.players[self.wolf_target]
  194.             if role_num == 2:
  195.                 self.seer = None
  196.            
  197.             if not self.check_winner(self.factory.channel):    
  198.                 self.lynch_time = True
  199.                 self.wolf_target = None
  200.                 self.wolf_targets = {}
  201.                
  202.                 self.not_voted = self.players.keys()
  203.                 self.vote_dict = {i:0 for i in self.not_voted}
  204.                 self.player_vote = {}
  205.                
  206.                 num_players = len(self.players)
  207.                 if num_players%2==0:
  208.                     self.majority = int((num_players / 2) + 1)
  209.                 else:
  210.                     self.majority = int(ceil(num_players / 2))
  211.            
  212.  
  213.     def update_vote(self,nick,target,channel):
  214.         self.msg(channel,'%s has vote for %s' % (nick,target))
  215.         #msg current vote tally
  216.         self.msg(channel,'Current votes: %s, a majority of %s is needed' % (', '.join(['%s:%s' % (k,v) for k, v in self.vote_dict.iteritems() if v > 0]),self.majority))
  217.         #if waiting on people to vote:
  218.         if self.not_voted:
  219.             self.msg(channel,'Waiting for: %s to vote.' % ', '.join(self.not_voted))
  220.         else:
  221.             #check majority vote
  222.             if not self.check_votes(channel):
  223.                 self.msg(channel,'Voteing stalemate, either come to a majority decision or %s can now use >force' % self.owner)
  224.             #print 'self.not_voted'
  225.             #if self.vote_dict[target] >= self.majority: #was a get #bad make it loop through and check
  226.             #   print 'we have maj'
  227.             #   self.lynch(target,channel)
  228.             #else:
  229.             #   self.msg(channel,'Voteing stalemate, either come to a majority decision or %s can now use >force' % self.owner)
  230.             #   print 'vote stalemate game owner could use >force now'
  231.             #self.check_majority()
  232.             #check who has majority vote,
  233.             #decide what to do if a stalemate, could probably....
  234.    
  235.     def check_votes(self,channel):
  236.         if [k for k, v in self.vote_dict.iteritems() if v >= self.majority]:
  237.             self.lynch(k,channel)
  238.             return True
  239.         else:#need the else?
  240.             return False
  241.    
  242.     def lynch(self,target,channel):
  243.         self.mode(channel,False,'v',None,target,None)
  244.         self.msg(channel,'%s %s' % (lynch_begin,target))
  245.         role_num = self.players[target]
  246.         self.msg(channel,'after examining the remains of %s everyone learns that %s was a %s. %s' % (target,target,roles[role_num],roles_left[role_num]))
  247.        
  248.         if role_num == 1:
  249.             self.wolves.remove(target)
  250.         elif role_num == 2:
  251.             self.seer = None
  252.         #refresh variables
  253.         del self.players[target]       
  254.        
  255.         if not self.check_winner(channel):
  256.             self.night_begin()
  257.        
  258.     def check_winner(self,channel):
  259.         if not self.wolves:
  260.             self.msg(channel,village_win)
  261.             print 'village win'
  262.             return True
  263.         elif len(self.wolves) >= len([k for k, v in self.players.iteritems() if v != 1]):
  264.             self.msg(channel,wolf_win)
  265.             print 'wolf win'
  266.             return True
  267.         else:
  268.             return False
  269.        
  270.     game = False
  271.     game_schedule = False
  272.     lynch_time = False
  273.     seen = False
  274.     killed = False
  275.     #used to track targets when more than one wolf
  276.     wolf_targets = {}
  277.     wolf_target = None
  278.     dead = []
  279.     owner = None #game owner/starter/founder
  280.     players = {}
  281.     owner_force = False
  282.    
  283.     def userLeft(self, user, channel):
  284.         if user in self.players:
  285.             self.player_gone(user,channel)
  286.            
  287.     def userQuit(self, user, quitMessage):
  288.         if user in self.players:
  289.             self.player_gone(user,self.factory.channel)
  290.        
  291.     def userKicked(self, user, channel, kicker, message):
  292.         if user in self.players:
  293.             self.player_gone(user,channel)
  294.  
  295.     def irc_NICK(self, user, params):
  296.         old_nick = user.split('!')[0]
  297.         new_nick = params[0]
  298.         if old_nick in self.players:
  299.             role = self.players[old_nick]
  300.             if role == 1:
  301.                 self.wolves[self.wolves.index(old_nick)] = new_nick
  302.                 self.wolf_targets[new_nick] = self.wolf_target[old_nick]
  303.                 del self.wolf_target[old_nick]
  304.             elif role == 2:
  305.                 self.seer = new_nick
  306.            
  307.             if old_nick == self.wolf_target:
  308.                 self.wolf_target = new_nick
  309.             if old_nick in self.wolf_targets.values():
  310.                 for k, v in self.wolf_targets.iteritems():
  311.                     if v == old_nick:
  312.                         self.wolf_targets[k] = new_nick
  313.            
  314.             del self.players[old_nick]
  315.             self.players[new_nick] = role
  316.            
  317.             #update votes etc
  318.             if self.lynch_time:
  319.                 if old_nick in self.not_voted:
  320.                     self.not_voted.remove(old_nick)
  321.                     self.not_voted.append(new_nick)
  322.                 else:
  323.                     self.player_vote[new_nick] = self.player_vote[old_nick]
  324.                     del self.player_vote[old_nick]
  325.                 #update vote count for this person
  326.                 self.vote_dict[new_nick] = self.vote_dict[old_nick]
  327.                 del self.vote_dict[old_nick]
  328.            
  329.             if old_nick == self.owner:
  330.                 self.owner = new_nick
  331.             self.notice(new_nick,'Tracked your nick change.')
  332.  
  333.     def privmsg(self, user, channel, msg):
  334.         nick = user.split('!')[0]
  335.         command = msg.split(' ')[0]
  336.  
  337.         if command == '>join' and channel == self.factory.channel:
  338.             if self.game and nick in self.players:
  339.                 self.notice(nick,'You are already in the game in progress')
  340.             elif self.game and nick not in self.players:
  341.                 self.notice(nick,'You may not join a game in progress')
  342.             elif self.game_schedule and nick in self.players:
  343.                 self.notice(nick,'You have already joined')
  344.             elif self.game_schedule and nick not in self.players:
  345.                 self.msg(channel,'%s has just joined the game' % nick)
  346.                 self.players[nick] = None
  347.             else:
  348.                 self.notice(nick,'No game at the moment, use >start to begin one')
  349.                
  350.         elif command == '>leave' and channel == self.factory.channel:
  351.             if self.game and nick in self.players:
  352.                 self.notice(nick,'You cant leave a game in progress')
  353.             elif self.game and nick not in self.players:
  354.                 self.notice(nick,'You cant leave a game you\'re not a part of')
  355.             elif self.game_schedule and nick in self.players:
  356.                 del self.players[nick]
  357.                 self.notice(nick,'You have just left the game')
  358.             elif self.game_schedule and nick not in self.players:
  359.                 self.notice(nick,'You cant leave a game you\'re not a part of')
  360.             else:
  361.                 self.notice(nick,'No game at the moment, use >start to begin one')
  362.            
  363.         elif command == '>start' and channel == self.factory.channel:
  364.             #expand
  365.             if self.game or self.game_schedule:
  366.                 self.notice(nick,'Game already in progress')
  367.             else:
  368.                 self.game_schedule = True
  369.                 self.owner = nick
  370.                 self.players[nick] = None
  371.                 self.notice(nick,'You are the game owner, use >begin to begin the game one all players have joined')
  372.                 self.msg(channel,'%s has just started a new game, use >join to join!' % nick)
  373.                
  374.         elif command == '>begin' and channel == self.factory.channel:
  375.             if self.game:
  376.                 self.notice(nick,'Game already in progress')
  377.             elif nick != self.owner and self.game_schedule:
  378.                 self.notice(nick,'Only the game owner can begin the game, current owner: %s' % self.owner)
  379.             elif nick == self.owner and self.game_schedule:
  380.                 if len(self.players) < min_players:
  381.                     self.msg(channel,'Not enough players to begin the new game')
  382.                 else:
  383.                     self.game_schedule = False
  384.                     self.game = True
  385.                     self.msg(channel,'New game starting, assigining roles')
  386.                     self.assign_roles(channel)
  387.             elif not self.game_schedule:
  388.                 self.notice(nick,'No game at the moment, use >start to begin one')
  389.        
  390.         elif command == commands['lynch'] and channel == self.factory.channel:
  391.             if not self.lynch_time:
  392.                 self.notice(nick,'Now is not the time for that')
  393.             else:
  394.                 try:
  395.                     target = msg.split(' ')[1]
  396.                 except IndexError, e:
  397.                     self.notice(nick,'No target given.')
  398.                 else:
  399.                     if target in self.players:
  400.                         if nick == target:
  401.                             self.notice(nick,'You cannot vote for yourself')
  402.                         elif nick in self.not_voted:
  403.                             self.not_voted.remove(nick)
  404.                             self.vote_dict[target] += 1
  405.                             self.player_vote[nick] = target
  406.                             self.notice(nick,'Vote set, current vote: %s' % target)
  407.                             self.update_vote(nick,target,channel)
  408.                         elif self.player_vote.get(nick,None) != target:
  409.                             self.vote_dict[self.player_vote.get(nick,None)] -= 1
  410.                             self.player_vote[nick] = target
  411.                             self.vote_dict[target] += 1
  412.                             self.notice(nick,'Vote updated, current vote: %s' % target)
  413.                             self.update_vote(nick,target,channel)  
  414.                         elif self.player_vote.get(nick,None) == target:
  415.                             self.notice(nick,'%s has already got your vote.' % target)
  416.                            
  417.                     elif target in self.dead:
  418.                         self.notice(nick,'You cannot vote for %s, since they are already dead' % target)
  419.                     else:
  420.                         self.notice(nick,'%s isn\'t playing' % target)
  421.  
  422.         elif command == commands['kill'] and channel == self.nickname:
  423.             if self.lynch_time and nick in self.wolves:
  424.                 self.msg(nick,'Now is not the time for that')
  425.             if not self.lynch_time and nick in self.wolves:
  426.                 if self.killed:
  427.                     if len(self.wolves) == 2:
  428.                         self.msg(nick,'You and the other %s have already decided on your target' % roles[1])
  429.                     else:
  430.                         try:
  431.                             target = msg.split(' ')[1]
  432.                         except IndexError, e:
  433.                             self.msg(nick,'No target given')
  434.                         else:
  435.                             if target == nick:
  436.                                 self.msg(nick,cant_kill_self)
  437.                             elif target in self.dead:
  438.                                 self.msg(nick,'%s is already dead' % target)
  439.                             elif target in self.players:
  440.                                 self.msg(nick,'Target updated')
  441.                                 self.wolf_target = target
  442.                                 self.check_night_finished()
  443.                 else:
  444.                     try:
  445.                         target = msg.split(' ')[1]
  446.                     except IndexError, e:
  447.                         self.msg(nick,'No target given')
  448.                     else:
  449.                         if target == nick:
  450.                             self.msg(nick,cant_kill_self)
  451.                         elif target in self.dead:
  452.                             self.msg(nick,'%s is already dead' % target)
  453.                         elif target in self.players and len(self.wolves) != 2:
  454.                             self.msg(nick,'Target set')
  455.                             self.wolf_target = target
  456.                             self.killed = True
  457.                             self.check_night_finished()
  458.                         elif target in self.wolves:
  459.                             self.msg(nick,cant_kill_wolf)
  460.                         elif target in self.players and len(self.wolves) == 2:
  461.                             self.msg(nick,'Target set')
  462.                             self.wolf_targets[nick] = target
  463.                             other_wolf = self.get_other_wolf(nick)
  464.                             if self.wolf_targets.get(other_wolf, None) == target:
  465.                                 self.msg('%s,%s' % (nick,other_wolf),'Target has been agreed on, no going back.') #sake of ease
  466.                                 self.wolf_target = target
  467.                                 self.killed = True
  468.                                 self.check_night_finished()
  469.                             elif self.wolf_targets.get(other_wolf, None) == None:
  470.                                 self.msg(nick,'%s hasn\'t chose a target yet' % other_wolf)
  471.                                 self.msg(other_wolf,'%s has just chosen %s as a target' % (nick,target))
  472.                             else:
  473.                                 self.msg(other_wolf,'%s has just chosen %s as a target' % (nick,target))
  474.                                 self.msg('%s,%s' % (nick,other_wolf),'You have both chosen different targets, you need to agree')
  475.                                
  476.                         else:
  477.                             self.msg(nick,'%s isn\'t playing' % target)
  478.                            
  479.         elif command == commands['see'] and channel == self.nickname:
  480.             if self.lynch_time and nick == self.seer:
  481.                 self.msg(nick,'Now is not the time for that')
  482.             elif not self.lynch_time and nick == self.seer:
  483.                 if self.seen:
  484.                     self.msg(nick,'You have already used your ability for tonight')
  485.                 else:
  486.                     try:
  487.                         target = msg.split(' ')[1]
  488.                     except IndexError, e:
  489.                         self.msg(nick,'No target given')
  490.                     else:
  491.                         if target == nick:
  492.                             self.msg(nick,'%s...try again' % cant_see_self)
  493.                         elif target in self.dead:
  494.                             self.msg(nick,'%s is dead' % target)
  495.                         elif target in self.players:
  496.                             self.msg(nick,'You are sure %s is a %s' % (target, roles[self.players[target]]))
  497.                             self.seen = True
  498.                             self.check_night_finished()
  499.                         else:
  500.                             self.msg(nick,'%s isn\'t playing' % target)
  501.    
  502.     def get_other_wolf(self,user):
  503.         for wolf in self.wolves:
  504.             if wolf != user:
  505.                 return wolf
  506.    
  507.     def ctcpQuery(self, user, channel, messages):
  508.         print 'Faggot is ctcp\'in'
  509.  
  510.  
  511. class WolfBotFactory(protocol.ClientFactory):
  512.     protocol = WolfBot
  513.  
  514.     def __init__(self, channel, nickname='Premium_Bot'):
  515.         self.channel = channel
  516.         self.nickname = nickname
  517.        
  518.     def clientConnectionLost(self, connector, reason):
  519.         connector.connect()
  520.        
  521.     def clientConnectionFailed(self, connector, reason):
  522.         print "Connection failure:", reason
  523.         reactor.stop()
  524.  
  525. if __name__ == '__main__':
  526.     reactor.connectTCP('paimon.skidsr.us', 6667, WolfBotFactory('#venuism'))
  527.     reactor.run()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement