games.py 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308
  1. import random
  2. from common import font, queries
  3. from commands.common import CommandHelpers as CH
  4. from commands.common import GameHelpers
  5. def do_command(self, connection, event, user, channel):
  6. cmdtype, trigger, command, replyto = CH.disect_command(self, event)
  7. # Do nothing if it's not a type of command.
  8. if not cmdtype:
  9. return
  10. # Do nothing if there is no command.
  11. if not command:
  12. return
  13. # The first word of the command sting with arguments, is just the command without arguments.
  14. try:
  15. one = command.split()[0] # Get raw command.
  16. except:
  17. return
  18. # Do noting if the games channel function is off and it's a channel message.
  19. if event.target != connection.get_nickname(): # Command issued to channel.
  20. if not queries.get_channel_setting_games_commands(self, channel.id): # Games are turned off in channel settigns.
  21. return # Do nothing.
  22. if command == 'cmd' or command == 'cmds' or command == 'commands':
  23. if cmdtype == 'cmd':
  24. connection.privmsg(replyto, '%sGames: %s%s%s%s%s%s' % (font.grey, CH.ccc(self, "player"), CH.ccc(self, "players"), CH.ccc(self, "levelup") ,CH.ccc(self, "givecoin"), CH.ccc(self, "8ball"), CH.ccc(self, "dice")[:-2]))
  25. connection.privmsg(replyto, font.grey + "Game help: " + font.blue + self.network.help_character + "level" + font.grey + ", " + font.blue + self.network.help_character + "xp" + font.grey + ", " + font.blue + self.network.help_character + "ap" + font.grey + ", " + font.blue + self.network.help_character + "coin" + font.grey + ", " + font.blue + self.network.help_character + "karma" + font.grey + ".")
  26. elif one == 'player':
  27. if len(command.split()) == 1:
  28. if cmdtype == 'help': # Display help text.
  29. connection.privmsg(replyto, 'Displays a users game statistics. User optional.')
  30. connection.privmsg(replyto, 'Usage: %s%s%s%s %snickname' % (font.blue, self.network.command_character, one, font.reset, font.italic))
  31. return
  32. message = '%sYour player stats: ' % font.grey
  33. player_name = event.source.nick
  34. player = queries.get_user(self, player_name)
  35. elif len(command.split()) == 2:
  36. player_name = command.split()[1]
  37. if cmdtype == 'help':
  38. connection.privmsg(replyto, 'Displays game stats for player: %s%s' % (font.red, player_name))
  39. return
  40. player = queries.get_user(self, player_name)
  41. if not player:
  42. connection.action(replyto, 'does not know of a %s%s%s.' % (font.red, trigger.split()[1], font.reset))
  43. return
  44. if player_name.lower() == connection.get_nickname().lower():
  45. connection.privmsg(replyto, "The game does not play the master.")
  46. return
  47. message = '%sPlayer stats for %s%s%s: ' % (font.grey, font.red, player.name, font.reset)
  48. else: # Too many arguments.
  49. connection.privmsg(replyto, 'Too many arguments, For help type: %s%s%s' % (font.blue, self.network.help_character, one))
  50. return
  51. info = GameHelpers.player_info(self, player)
  52. connection.privmsg(replyto, message + info)
  53. elif one == 'levelup':
  54. level, xp, xp_spent, total_xp, karma, coin, coin_spent, coin_given, ap, ap_spent = GameHelpers.get_info(self, user)
  55. if cmdtype == 'help': #Display help text.
  56. connection.privmsg(replyto, 'Spend %s XP to gain your next level. Levelup multiple levels by adding an amount.' % str(int(level * 2.7)))
  57. connection.privmsg(replyto, 'Example: %s%s%s 3' % (font.blue, self.network.command_character, one))
  58. elif cmdtype == "cmd":
  59. upgrade_count = 1
  60. if xp < int(level * 2.7):
  61. connection.privmsg(replyto, "Insufficient XP, you need at least " + str(int(level * 2.7)) + ".")
  62. return
  63. elif ap < 1:
  64. connection.privmsg(replyto, "Insufficient AP, you need at least 1.")
  65. return
  66. elif len(command.split()) == 2: # Command with one argument.
  67. try:
  68. levels = int(command.split()[1])
  69. except:
  70. connection.privmsg(replyto, "Invalid amount.")
  71. return
  72. if levels < 1:
  73. connection.privmsg(replyto, "Invalid amount.")
  74. return
  75. upgrade_count = levels # Valid amount.
  76. elif len(command.split()) >= 3:
  77. connection.privmsg(replyto, "Too many arguments. For help type " + font.blue + self.network.help_character + "levelup" + font.reset + ".")
  78. return
  79. while xp > int(level * 2.7) and ap > 0 and upgrade_count > 0:
  80. print(upgrade_count)
  81. queries.levelup_user(self, user.id, int((level + 1) * 2.7))
  82. level, xp, xp_spent, total_xp, karma, coin, coin_spent, coin_given, ap, ap_spent = GameHelpers.get_info(self, user)
  83. if upgrade_count < 0:
  84. connection.privmsg(replyto, 'Exhausted XP or AP before levelup was complete. You are only partially levelled up.')
  85. info = GameHelpers.player_info(self, user)
  86. connection.privmsg(replyto, "Your new statistics: " + info)
  87. elif one == 'givecoin':
  88. if cmdtype == 'help': #Display help text.
  89. connection.privmsg(replyto, "Give coins to another player. Amount optional.")
  90. connection.privmsg(replyto, font.grey + "Usage: " + font.blue + self.network.command_character + "givecoin " + font.reset + font.italic + "user amount")
  91. elif cmdtype == "cmd":
  92. if len(command.split()) == 1:
  93. connection.privmsg(replyto, "Insufficient arguments. For help type " + font.blue + self.network.help_character + "givecoin" + font.reset + ".")
  94. return
  95. elif len(command.split()) > 3:
  96. connection.privmsg(replyto, "Too many arguments. For help type " + font.blue + self.network.help_character + "givecoin" + font.reset + ".")
  97. return
  98. elif command.split()[1] == event.source.nick.lower():
  99. connection.privmsg(replyto, "You already have your own coin. For help type " + font.blue + self.network.help_character + "givecoin" + font.reset + ".")
  100. return
  101. elif command.split()[1] == connection.get_nickname() or command.split()[1] == self.network.nickname:
  102. connection.privmsg(replyto, "I don't need that. If I wanted I could take all your coin and there would be nothing for you to do to stop me....")
  103. return
  104. elif len(command.split()) == 3:
  105. try:
  106. if float(command.split()[2]) < 0:
  107. connection.privmsg(replyto, "You clever abuser! The " + font.red + self.network.command_character + font.bold + "give" + font.bold + "coin" + font.reset + " command is not designed for robbing. There will be consequences...")
  108. queries.punish_user(self, user_id, -3, -1)
  109. return
  110. except TypeError:
  111. connection.privmsg(replyto, "Invalid amount. For help type " + font.blue + self.network.help_character + "givecoin" + font.reset + ".")
  112. return
  113. elif event.target == connection.get_nickname(): # Private message
  114. for channel in self.channels:
  115. user_present = False
  116. if command.split()[1] in self.channels[channel].users(): # User is on a channel the bot inhabits.
  117. user_present = True
  118. if not user_present:
  119. connection.privmsg(replyto, font.red + trigger.split()[1] + font.reset + " is not present on any channel I inhabit.")
  120. return
  121. else: # Channel message
  122. if not command.split()[1] in self.channels[event.target].users():
  123. connection.privmsg(replyto, font.red + trigger.split()[1] + font.reset + " is not present on this channel.")
  124. return
  125. level, xp, xpspent, totalxp, karma, coin, coinspent, coingiven, ap, apspent = GameHelpers.get_info(self, user)
  126. receiver = queries.get_user(self, command.split()[1])
  127. if level < 1:
  128. connection.privmsg(replyto, "You need to " + font.blue + self.network.command_character + "levelup " + font.reset + "to be able to give coin.")
  129. return
  130. elif coin < 1:
  131. connection.privmsg(replyto, "You have no coin to give.")
  132. return
  133. elif not receiver:
  134. connection.action(replyto, "does not know of any \"" + font.red + trigger.split()[1] + font.reset + "\".")
  135. return
  136. elif receiver.level <= 0:
  137. connection.privmsg(replyto, font.red + trigger.split()[1] + font.reset + " is not playing the game.")
  138. return
  139. #elif receiver.away == True:
  140. # connection.privmsg(replyto, font.red + trigger.split()[1] + font.reset + "is not here right now.")
  141. # return
  142. elif ap < 1:
  143. connection.privmsg(replyto, "You have no action points.")
  144. return
  145. if len(command.split()) == 2:
  146. queires.cointransfer(self, user_id, command.split()[1])
  147. elif len(command.split()) == 3:
  148. if coin < command.split()[2]:
  149. connection.privmsg(replyto, "You do not have enough coin.")
  150. return
  151. queires.cointransfer(self, sender.id, receiver.id)
  152. info = GameHelpers.player_info(self, sender)
  153. connection.notice(event.source.nick, "Your new statistics: " + info)
  154. elif one == 'players':
  155. if cmdtype == 'help': #Display help text.
  156. connection.privmsg(replyto, 'Display top player rankings.')
  157. elif cmdtype == "cmd":
  158. toplevel = GameHelpers.list_top_players(self, "level")
  159. topxp = GameHelpers.list_top_players(self, "xp_spent")
  160. topcoin = GameHelpers.list_top_players(self, "coin")
  161. if toplevel:
  162. connection.notice(event.source.nick, "Ranking level: " + toplevel)
  163. elif topxp:
  164. connection.notice(event.source.nick, "Ranking experience: " + topxp)
  165. elif topcoin:
  166. connection.notice(event.source.nick, "Ranking wealth: " + topcoin)
  167. else:
  168. connection.privmsg(replyto, "Nobody is playing the game.")
  169. elif command.split()[0] == "level":
  170. if cmdtype == "help": #Display help text.
  171. connection.privmsg(replyto, "For increasing amounts of XP you can use !levelup to gain a level. As your level increases, things become more difficult, while more capabilities and options are attained.")
  172. elif command.split()[0] == "xp":
  173. if cmdtype == "help": #Display help text.
  174. connection.privmsg(replyto, "XP is earned by using IRC and playing the game, in channels with " + font.red + connection.get_nickname() + font.reset + ". Ask any operator in " + font.red + self.network.home_channel + font.reset + " to add a channel. XP is used to level up, advance classes, as a limit and as a multiplier. Once XP is expended it keeps counting towards your total.")
  175. elif command.split()[0] == "ap":
  176. if cmdtype == "help": #Display help text.
  177. connection.privmsg(replyto, "AP is earned by using IRC and playing the game in channels with " + font.red + connection.get_nickname() + font.reset + ". Ask any operator in " + font.red + self.network.home_channel + font.reset + " to add a channel. AP is expended for every action you take in the game.")
  178. elif command.split()[0] == "coin":
  179. if cmdtype == "help": #Display help text.
  180. connection.privmsg(replyto, "Coin is earned when certain events occur, mostly when other players perform actions. Coin is used to buy items and classes. To give a player coin use " + font.blue + self.network.command_character + "givecoin" + font.reset + ". Coin affects karma.")
  181. elif command.split()[0] == "karma":
  182. if cmdtype == "help": #Display help text.
  183. connection.privmsg(replyto, "Karma is a secret formula, based upon on your IRC events and how you play the game. It does not increase like XP. Some events, skills and items are karma based.")
  184. elif command.split()[0] == "8ball":
  185. if cmdtype == "help": #Display help text.
  186. connection.privmsg(replyto, "Ask a question of the mighty and illusive 8-Ball.")
  187. connection.privmsg(replyto, font.grey + "Usage: " + font.blue + self.network.command_character + "8ball " + font.reset + font.italic + "question")
  188. elif cmdtype == "cmd":
  189. if len(command.split()) < 2: # Command contains only !8ball.
  190. messages = [
  191. "Don't forget to ask a question...",
  192. "Hey, that's not a question!",
  193. "What would you like to know?",
  194. "You want me to predict nothing?",
  195. "Are you intentionally not asking a question?",
  196. "Ask a question you tease!",
  197. "You do not seem to grasp this, for help type: " + font.blue + self.network.help_character + "8ball",
  198. "You will die alone.",
  199. ]
  200. connection.privmsg(replyto, random.choice(messages))
  201. else:
  202. messages = [
  203. "Yes.",
  204. "No.",
  205. "Affirmative.",
  206. "No way!",
  207. "Negative.",
  208. "Positive.",
  209. "Correct.",
  210. "Incorrect.",
  211. "Likely",
  212. "Unlikely",
  213. "Maybe.",
  214. "Definately!",
  215. "Perhaps?",
  216. "Most indubitably.",
  217. "Does the pope shit in the woods?",
  218. "When hell freezes over.",
  219. "Only between 9 and 5.",
  220. "Only just before you die.",
  221. font.red + font.bold + "ERROR: " + font.bold + "probability failure.",
  222. "Ask again later.",
  223. "I don't know.",
  224. "Unpredictable.",
  225. ]
  226. connection.privmsg(replyto, random.choice(messages))
  227. elif command.split()[0] == "dice":
  228. if cmdtype == "help": #Display help text.
  229. if len(command.split()) != 1:
  230. return
  231. connection.privmsg(replyto, "Rolls multiple dices of chosen type. Specifying type or amount is optional.")
  232. connection.privmsg(replyto, font.grey + "Usage: " + font.blue + self.network.command_character + "dice " + font.reset + font.italic + "amount type")
  233. connection.privmsg(replyto, font.grey + "Example: " + font.blue + self.network.command_character + "dice " + font.reset + font.italic + "2 d10")
  234. connection.privmsg(replyto, font.grey + "Note: " + font.reset + "The dice type is specified as a " + font.italic + "d " + font.reset + "followed by the amount of sides.")
  235. elif cmdtype == "cmd":
  236. arguments = len(command.split()) - 1
  237. if arguments == 0:
  238. connection.privmsg(replyto, str(random.randint(1, 6)) + " & " + str(random.randint(1, 6)) + ".")
  239. elif arguments == 1:
  240. try:
  241. diceamount = int(command.split()[1])
  242. except ValueError: # Argument is not an integer.
  243. if command.split()[1].startswith("d"): # Specific dice type.
  244. try:
  245. dicetype = int(command.split()[1][1:])
  246. except ValueError: # "d" not followd by interger.
  247. connection.privmsg(replyto, "Invalid number or type of dice. For help type: " + font.blue + self.network.help_character + "dice" + font.reset + ".")
  248. return
  249. if dicetype < 1:
  250. connection.action(replyto, "can not create objects with less then one side.")
  251. else:
  252. connection.privmsg(replyto, str(GameHelpers.roll_dice(1, dicetype)[0]))
  253. else: # Argument does not start with "d" and is not an integer.
  254. connection.privmsg(replyto, "Invalid number or type of dice. For help type: " + font.blue + self.network.help_character + "dice" + font.reset + ".")
  255. return
  256. if diceamount < 1:
  257. connection.privmsg(replyto, "Rolling " + font.bold + "no " + font.reset + "dice.")
  258. elif diceamount > 10:
  259. connection.action(replyto, "can not fit that many dice into it's robot hands.")
  260. else:
  261. connection.privmsg(replyto, ", ".join(str(rolls) for rolls in GameHelpers.roll_dice(diceamount, 6)) + ".") # Roll x amount of dice.
  262. elif arguments == 2:
  263. try:
  264. diceamount = int(command.split()[1])
  265. except ValueError: # First argument not an integer.
  266. connection.privmsg(replyto, "Invalid number of dice. For help type: " + font.blue + self.network.help_character + "dice" + font.reset + ".")
  267. return
  268. try:
  269. dicetype = int(command.split()[2][1:])
  270. except ValueError: # Second argument not a dice type.
  271. connection.privmsg(replyto, "Invalid type of dice. For help type: " + font.blue + self.network.help_character + "dice" + font.reset + ".")
  272. return
  273. if diceamount < 1:
  274. connection.privmsg(replyto, "Rolling " + font.bold + "no " + font.reset + "dice.")
  275. elif diceamount > 10:
  276. connection.action(replyto, "can not fit that many dice into it's robot hands.")
  277. elif dicetype < 1:
  278. connection.action(replyto, "can not create objects with less then one side.")
  279. elif dicetype > 9999999999 and diceamount > 1:
  280. connection.action(replyto, "Those dices are so large i can only roll one at a time.")
  281. else:
  282. connection.privmsg(replyto, ", ".join(str(rolls) for rolls in GameHelpers.roll_dice(diceamount, dicetype)) + ".") # Roll x amount of x type dice.
  283. else: # Invalid amount of arguments.
  284. connection.privmsg(replyto, "Too many arguments. For help type: " + font.blue + self.network.help_character + "dice" + font.reset + ".")