common.py 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227
  1. import random
  2. from common import font
  3. class CommandHelpers():
  4. def disect_command(self, event):
  5. trigger = event.arguments[0] # Everything the user inputted.
  6. command = trigger[1:].lower() # Command without prefix. = trigger minus first character.
  7. # Determine command type.
  8. if trigger.startswith(self.network.command_character):
  9. cmdtype = 'cmd'
  10. elif trigger.startswith(self.network.help_character):
  11. cmdtype = 'help'
  12. else:
  13. cmdtype = False
  14. # Determine where to reply to.
  15. if event.type == 'pubmsg':
  16. replyto = event.target
  17. elif event.type == 'privmsg':
  18. replyto = event.source.nick
  19. else:
  20. replyto = False
  21. return(cmdtype, trigger, command, replyto)
  22. def ccc(self, command, rights=False, event=False): # Commandlist colour coding and channel rights filter.
  23. if rights:
  24. show = False
  25. if rights["homechan"] == "owner":
  26. if self.channels[self.network.home_channel].is_owner(event.source.nick):
  27. show = True
  28. if rights["homechan"] == "admin":
  29. if self.channels[self.network.home_channel].is_owner(event.source.nick) or self.channels[self.network.home_channel].is_admin(event.source.nick):
  30. show = True
  31. if rights["homechan"] == "oper":
  32. if self.channels[self.network.home_channel].is_owner(event.source.nick) or self.channels[self.network.home_channel].is_admin(event.source.nick) or self.channels[self.network.home_channel].is_oper(event.source.nick):
  33. show = True
  34. if not event.target == self.connection.get_nickname(): # Channel message.
  35. if rights["chan"] == "owner":
  36. if self.channels[event.target].is_owner(event.source.nick):
  37. show = True
  38. if rights["chan"] == "admin":
  39. if self.channels[event.target].is_owner(event.source.nick) or self.channels[event.target].is_admin(event.source.nick):
  40. show = True
  41. if rights["chan"] == "oper":
  42. if self.channels[event.target].is_owner(event.source.nick) or self.channels[event.target].is_admin(event.source.nick) or self.channels[event.target].is_oper(event.source.nick):
  43. show = True
  44. if show:
  45. return font.blue + self.network.command_character + command + font.grey + ", "
  46. else:
  47. return font.blue + self.network.command_character + command + font.grey + ", "
  48. class AdminHelpers():
  49. def get_channelfunctions(self, channel):
  50. #channelfunctions = self.db.one("SELECT autojoin, aggressiveness, join_greeting, statistics_commands, games, chat FROM channels WHERE LOWER(name)=LOWER('" + channel + "') AND network='" + self.network + "'")
  51. channelfunctions = self.db.one("SELECT autojoin FROM rotbot_channels WHERE LOWER(name)=LOWER('" + channel + "') AND network='" + self.network.id + "'")
  52. if channelfunctions[0]:
  53. autojoin = "on"
  54. else:
  55. autojoin = "off"
  56. # if channelfunctions[2]:
  57. # joingreet = "on"
  58. # else:
  59. # joingreet = "off"
  60. # if channelfunctions[3]:
  61. # statscmds = "on"
  62. # else:
  63. # statscmds = "off"
  64. # if channelfunctions[4]:
  65. # games = "on"
  66. # else:
  67. # games = "off"""
  68. # if channelfunctions[5]:
  69. # chat = "on"
  70. # else:
  71. # chat = "off"""
  72. #return ("autojoin " + font.green + autojoin + font.reset + ", aggressiveness " + font.green + channelfunctions[1] + font.reset + ", join_greeting " + font.green + joingreet + font.reset + ", statistics_commands " + font.green + statscmds + font.reset + ", games " + font.green + games + font.reset + ", chat " + font.green + chat + font.reset + ".")
  73. return ('autojoin %s %s %s.' % font.green, autojoin, font.reset)
  74. def is_channelfunction(value):
  75. if value.lower() in ["autojoin", "aggressiveness", "join_greeting", "statistics_commands", "games", "chat"]:
  76. return True
  77. else:
  78. return False
  79. def describe_channelfunction(function):
  80. if function == "autojoin":
  81. message = "Join the channel automaticly after connecting."
  82. elif function == "aggressiveness":
  83. message = "How to respond to kick, ban and mode events. Options: " + font.blue + "passive" + font.reset + ", " + font.blue + "defense_only" + font.reset + ", " + font.blue + "equal_retalliation" + font.reset + ", " + font.blue + "battlebot" + font.reset + "."
  84. elif function == "join_greeting":
  85. message = "Greet users joining the channel on the first few joins, and later on large amounts."
  86. elif function == "statistics_commands":
  87. message = "Enable use of statistics commands."
  88. elif function == "games":
  89. message = "Enable use of game commands."
  90. elif function == "chat":
  91. message = "Respond to and initiate chat."
  92. else:
  93. message = "Sorry, this function has no description yet."
  94. return message
  95. def is_aggressiveness(value):
  96. if value.lower() in ["passive", "defense_only", "equal_retalliation", "battlebot"]:
  97. return True
  98. else:
  99. return False
  100. class GameHelpers():
  101. def roll_dice(amount, type):
  102. rolls = []
  103. for iterations in range(amount):
  104. rolls.append(random.randint(1, type))
  105. return rolls
  106. def get_info(self, user):
  107. user = user.lower()
  108. all_joins = self.db.all("SELECT joins FROM joins WHERE LOWER(\"user\")=%s AND user_network='" + self.network + "'", (user, ))
  109. all_kicks = self.db.all("SELECT given, received FROM kicks WHERE LOWER(\"user\")=%s AND user_network='" + self.network + "'", (user, ))
  110. all_messages = self.db.all("SELECT messages, messages_words, messages_characters, actions, actions_words, actions_characters, notices, notices_words, notices_characters FROM messages WHERE LOWER(\"user\")=%s AND user_network='" + self.network + "'", (user, ))
  111. joins =0
  112. for record in all_joins:
  113. joins += record
  114. given = 0
  115. received = 0
  116. for record in all_kicks:
  117. given += int(record[0])
  118. received += int(record[1])
  119. messages = 0
  120. messages_words = 0
  121. messages_characters = 0
  122. actions = 0
  123. actions_words = 0
  124. actions_characters = 0
  125. notices = 0
  126. notices_words = 0
  127. notices_characters = 0
  128. for record in all_messages:
  129. messages += int(record[0])
  130. messages_words += int(record[1])
  131. messages_characters += int(record[2])
  132. actions += int(record[3])
  133. actions_words += int(record[4])
  134. actions_characters += int(record[5])
  135. notices += int(record[6])
  136. notices_words += int(record[7])
  137. notices_characters += int(record[8])
  138. userrecord = self.db.one("SELECT xp_spent, level, coin, coin_given, coin_spent, ap_spent, karma_correction FROM users WHERE LOWER(name)=%s AND network='" + self.network + "'", (user, ))
  139. xp_spent = userrecord[0]
  140. level = userrecord[1]
  141. coin = userrecord[2]
  142. coin_given = userrecord[3]
  143. coin_spent = userrecord[4]
  144. ap_spent = userrecord[5]
  145. karma_correction = userrecord[6]
  146. chatxp = messages + (messages_words / 4) + (messages_characters / 10) + ((actions + (actions_words / 4) + (actions_characters / 10)) * 2) + ((notices + (notices_words / 4) + (notices_characters / 10)) / 2)
  147. kickxp = given * received
  148. total_xp = ((joins + kickxp + chatxp) / 120) + float(coin_spent + ap_spent / 8)
  149. xp = total_xp - xp_spent
  150. ap = total_xp - float(ap_spent)
  151. total_messages = messages + actions + notices
  152. total_words = messages_words + actions_words + notices_words
  153. total_characters = messages_characters + actions_characters + notices_characters
  154. if total_xp < 1:
  155. total_xp = 1
  156. joinkarma = (((messages / 19) - joins) / total_xp) /10
  157. words_per_message = (total_words / 6) - total_messages
  158. characters_per_message = (total_characters / 20) - total_messages
  159. characters_per_word = (total_characters / 6) - total_words
  160. chatkarma = ((words_per_message + characters_per_message + characters_per_message + characters_per_word) / total_xp) / 100
  161. kickkarma = ((given * received) / total_xp) / 2
  162. xpkarma = xp / 25
  163. coinkarma = (coin - coin_given / (xp_spent + 1)) / 99
  164. karma = float(joinkarma) + float(chatkarma) - float(kickkarma) + float(xpkarma) - float(coinkarma) + float(karma_correction)
  165. if xp < 0:
  166. xp = 0
  167. return level, xp, xp_spent, total_xp, karma, coin, coin_spent, coin_given, ap, ap_spent
  168. def list_top_players(self, sort):
  169. result = self.db.all("SELECT name, level, xp_spent, coin FROM users WHERE network=%s ORDER BY " + sort + " DESC LIMIT 3 ", (self.network, ))
  170. if sort == "level":
  171. column = 1
  172. threshold = 0
  173. if sort == "xp_spent":
  174. column = 2
  175. threshold = 0
  176. if sort == "coin":
  177. column = 3
  178. threshold = 10
  179. message = ""
  180. for record in result:
  181. if not record[column] <= threshold:
  182. level, xp, xpspent, totalxp, karma, coin, coinspent, coingiven, ap, apspent = GameHelpers.get_info(self, record[0])
  183. if ap < 0:
  184. ap = 0
  185. if sort == "level":
  186. message += red + str(record[0]) + font.reset + " [" + font.blue + "L " + font.green + str(level) + font.reset + ", X " + font.grey + str(xpspent) + "/" + font.green + str(int(xp)) + font.reset + ", A " + str(int(ap)) + ", C " + font.green + str(coin) + font.reset + ", K " + font.green + str(round(karma, 2)) + font.reset + "], "
  187. if sort == "xp_spent":
  188. message += red + str(record[0]) + font.reset + " [L " + font.green + str(level) + font.reset + ", " + font.blue + "X " + font.grey + str(xpspent) + "/" + font.green + str(int(xp)) + font.reset + ", A " + str(int(ap)) + ", C " + font.green + str(coin) + font.reset + ", K " + font.green + str(round(karma, 2)) + font.reset + "], "
  189. if sort == "coin":
  190. message += red + str(record[0]) + font.reset + " [L " + font.green + str(level) + font.reset + ", X " + font.grey + str(xpspent) + "/" + font.green + str(int(xp)) + font.reset + ", " + font.reset + "A " + str(int(ap)) + ", " + font.blue + "C " + font.green + str(coin) + font.reset + ", K " + font.green + str(round(karma, 2)) + font.reset + "], "
  191. return message[:-2]
  192. def player_info(self, user):
  193. level, xp, xpspent, totalxp, karma, coin, coinspent, coingiven, ap, apspent = GameHelpers.get_info(self, user)
  194. if ap < 0:
  195. ap = 0
  196. return "Level: " + str(level) + font.grey + ", " + font.reset + "XP: " + str(int(xp)) + "/" + font.grey + str(round(totalxp, 4)) + ", " + font.reset + "AP: " + str(int(ap)) + font.grey + ", " + font.reset + "coin: " + str(coin) + font.grey + "[S " + str(coinspent) + ", G " + str(coingiven) + "], " + font.reset + "karma: " + str(round(karma, 4))
  197. class StatisticsHelpers():
  198. def add_message_stats(stats):
  199. messages = 0
  200. words = 0
  201. characters = 0
  202. for record in stats:
  203. messages += record[0]
  204. words += record[1]
  205. characters += record[2]
  206. return messages, words, characters