Advertisement
nucular

rpgbot.py

Nov 3rd, 2013
79
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 4.63 KB | None | 0 0
  1. """
  2. nucescape 1.0
  3. =============
  4. A little RPG-themed IRC multiplayer game.
  5. """
  6. import cPickle
  7.  
  8. from twisted.internet import reactor
  9. import botbase
  10. import maps
  11.  
  12.  
  13. # Configuration
  14. HOST = "irc.freenode.net"
  15. PORT = 6667
  16. NICK = "nucbot-rpg"
  17. CHANNELS = ["##nucular"]
  18. SHOUTCHANS = ["##nucular"]
  19. MAP = maps.map1
  20. PREFIX = "<"
  21. OWNERMASK = "*!*@unaffiliated/nucular"
  22. LOGLEVEL = botbase.DEBUG
  23.  
  24. def fancyList(lst):
  25.     if len(lst) == 0:
  26.         return "None"
  27.     elif len(lst) == 1:
  28.         return lst[0]
  29.     elif len(lst) == 2:
  30.         return "%s and %s" % (lst[0], lst[1])
  31.     else:
  32.         msg = ", ".join(lst[:-1])
  33.         msg += " and " + lst[-1]
  34.         return msg
  35.  
  36. class Character(object):
  37.     def __init__(self, bot, nick, user, god=False):
  38.         self.bot = bot
  39.         self.nick = nick
  40.         self.user = user
  41.         self.god = god
  42.         self.inventory = []
  43.    
  44.     def msg(self, msg):
  45.         self.bot.msg(self.nick, msg)
  46.    
  47.     def command(self, cmd):
  48.         hm = botbase.getHostmask(self.user)
  49.         if cmd == "quit":
  50.             self.msg("You leave the game.")
  51.             del self.bot.activeCharacters[self.user]
  52.    
  53.     def introduction(self):
  54.         self.msg("Welcome to the world of %s!" % NICK)
  55.         self.msg("Currently, you can only quit and join :<")
  56.  
  57.  
  58. class RPGBot(botbase.BotBase):
  59.     """This is our main bot class."""
  60.     def __init__(self, factory, gamemap):
  61.         botbase.BotBase.__init__(self, factory)
  62.         # This dict maps hostmasks to Character objects.
  63.         # It can be pickled to store the game state.
  64.         self.characters = {}
  65.         # This one maps actual hosts to Character objects.
  66.         self.activeCharacters = {}
  67.         self.gamemap = gamemap
  68.  
  69.     def channelMsg(self, user, nick, channel, msg):
  70.         """Will be called on receiving a channel message."""
  71.         botbase.BotBase.channelMsg(self, user, nick, channel, msg)
  72.         if msg.startswith(PREFIX):
  73.             self.command(channel, user, nick, msg[1:])
  74.  
  75.     def privateMsg(self, user, nick, msg):
  76.         botbase.BotBase.privateMsg(self, user, nick, msg)
  77.         hm = botbase.getHostmask(user)
  78.         if hm in self.characters:
  79.             self.characters[hm].command(msg)
  80.         else:
  81.             if msg.startswith(PREFIX):
  82.                 self.command(nick, user, nick, msg[1:])
  83.    
  84.     def saveState(self):
  85.         pass
  86.    
  87.     def command(self, target, user, nick, cmd):
  88.         hm = botbase.getHostmask(user)
  89.         self.logger(botbase.INFO, "Command! "+cmd)
  90.  
  91.         if cmd == "panic" and self.isGod(user):
  92.             self.saveState()
  93.             for i in CHANNELS:
  94.                 self.msg(i, "Panic quit requested by %s!" % nick)
  95.             for i in self.activeCharacters:
  96.                 self.msg(i.nick, "Panic quit requested by %s! Your game was saved." % nick)
  97.             self.factory.reconnect = False
  98.             connector.disconnect()
  99.  
  100.         elif cmd == "join":
  101.             if user in self.activeCharacters:
  102.                 self.msg(user, "You are already active.")
  103.             elif hm in self.characters:
  104.                 self.activeCharacters[user] = self.characters[hm]
  105.                 self.msg(user, "Welcome back!")
  106.             else:
  107.                 newchar = Character(self, nick, user, self.isGod(user))
  108.                 self.activeCharacters[user] = newchar
  109.                 self.characters[hm] = newchar
  110.                 newchar.introduction()
  111.                 print self.characters
  112.  
  113.         elif cmd == "active":
  114.             msg = "These users are currently playing: "
  115.             msg += fancyList([self.activeCharacters[i].nick for i in self.activeCharacters])
  116.             self.msg(target, msg)
  117.  
  118.         elif cmd.startswith("help"):
  119.             if cmd.endswith("panic"):
  120.                 self.msg(target, "panic: Saves the game and halts the bot. Only for gods.")
  121.             elif cmd.endswith("join"):
  122.                 self.msg(target, "join: Join the game. Creates a new character or loads the last one.")
  123.             elif cmd.endswith("active"):
  124.                 self.msg(target, "active: Shows a list of active users.")
  125.             else:
  126.                 self.msg(target, "These commands are available here: panic, join, active, help.")
  127.    
  128.     def isGod(self, user):
  129.         hm = botbase.getHostmask(user)
  130.         if hm in self.characters:
  131.             return self.characters[hm].god
  132.         else:
  133.             return hm == OWNERMASK
  134.  
  135.  
  136. # Let there be bot!
  137. if __name__ == "__main__":
  138.     logger = botbase.Logger(LOGLEVEL)
  139.     f = botbase.BotBaseFactory(RPGBot, NICK, CHANNELS, [MAP], logger)
  140.     connector = reactor.connectTCP(HOST, PORT, f)
  141.     reactor.run()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement