Advertisement
Guest User

Untitled

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