public.py 7.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123
  1. from common import userstatus
  2. from commands.common import CommandHelpers as CH
  3. bold = "\x02"
  4. italic = "\x1D"
  5. underline = "\x1F"
  6. reverse = "\x16" # swap background and foreground colors ("reverse video")
  7. reset = "\x0F"
  8. blue = "\x0302"
  9. green = "\x0303"
  10. red = "\x0304"
  11. grey = "\x0314"
  12. def do_command(self, connection, event):
  13. cmdtype, trigger, command, replyto = CH.disect_command(self, event)
  14. if not command: # Do nothing if there is no command.
  15. return
  16. # The actual commands:
  17. if command == "test":
  18. if cmdtype == "help": #Display help text.
  19. if len(command.split()) is not 1:
  20. return
  21. connection.privmsg(replyto, "Strictly for testing purposes only!")
  22. elif cmdtype == "cmd":
  23. connection.privmsg(replyto, str(self.channels[self.homechannel].owners()))
  24. if event.target == connection.get_nickname(): # PM
  25. connection.privmsg(replyto, event)
  26. else: # Channel message.
  27. connection.privmsg(replyto, str(self.channels[event.target]))
  28. elif command == "cmd" or command == "commands":
  29. if cmdtype == "help": #Display help text.
  30. if len(command.split()) is not 1:
  31. return
  32. connection.privmsg(replyto, "Displays a list of commands.")
  33. elif cmdtype == "cmd":
  34. if not event.target == connection.get_nickname() and not self.db.one("SELECT join_greeting FROM channels WHERE name='" + event.target + "' AND network='" + self.network + "'"):
  35. connection.privmsg(replyto, grey + "Commands: " + CH.ccc(self, "cmd") + CH.ccc(self, "help")[:-2] + ".")
  36. else:
  37. connection.privmsg(replyto, grey + "Commands: " + CH.ccc(self, "cmd") + CH.ccc(self, "help") + CH.ccc(self, "stopgreet")[:-2] + ".")
  38. elif command == "help":
  39. if cmdtype == "help": #Display help text.
  40. if len(command.split()) is not 1:
  41. return
  42. connection.privmsg(replyto, "Explains how to get help on any specific command and hints the user to the commandlist.")
  43. elif cmdtype == "cmd":
  44. connection.privmsg(replyto, "Replace the " + italic + "! " + reset + "prefix of any comand with " + italic + self.helpchar + " " + reset + "for help with a specific command. Request the command list with: " + blue + "!cmd")
  45. connection.privmsg(replyto, grey + "Example: " + reset + blue + self.helpchar + "help")
  46. elif command.split()[0] == "stopgreet":
  47. if cmdtype == "help": #Display help text.
  48. if len(command.split()) is not 1:
  49. return
  50. connection.privmsg(replyto, "Stops the bot from greeting you or a specific user. Channel, user and option to resume optional.")
  51. connection.privmsg(replyto, grey + "Usage: " + blue + "!stopgreet " + red + reset + italic + "resume " + red + "channel user")
  52. elif cmdtype == "cmd":
  53. # Check for resume variation of command.
  54. resume = False
  55. try:
  56. if command.split()[1] == "resume":
  57. resume = True
  58. command = command.split(' ', 1)[1] # Remove the resume argument. Which makes the following logic easier.
  59. except:
  60. pass
  61. if len(command.split()) == 1: # No arguments.
  62. if event.target == connection.get_nickname(): # PM.
  63. connection.privmsg(replyto, "Specify at least a channel. For help type " + blue + self.helpchar + "stopgreet" + reset + ".")
  64. return
  65. user = event.source.nick
  66. channel = event.target
  67. if len(command.split()) == 2: # One argument.
  68. if command.split()[1] not in self.channels: # Argument is not a channel the bot inhabits.
  69. if event.target == connection.get_nickname(): # PM.
  70. connection.action(replyto, "does not inhabit " + red + command.split()[1] + reset + ".")
  71. return
  72. # Channel message
  73. if not userstatus.atleast_halfop(self, event.source.nick, self.homechannel) and not userstatus.atleast_halfop(self, event.source.nick, event.target): # Insufficient rights.
  74. connection.privmsg(replyto, "Denied. You need to have at least halfop status in " + red + self.homechannel + reset + " or " + red + event.target + reset + ".")
  75. return
  76. # Stopgreet for x user in current channel
  77. user = command.split()[1]
  78. channel = event.target
  79. else: # Bot inhabit channel.
  80. user = event.source.nick
  81. channel = command.split()[1]
  82. if len(command.split()) == 3: # Two arguments.
  83. if command.split()[1] not in self.channels: # Bot does not inhabit channel.
  84. connection.action(replyto, "does not inhabit " + red + command.split()[1] + reset + ".")
  85. return
  86. if not userstatus.atleast_halfop(self, event.source.nick, self.homechannel) and not userstatus.atleast_halfop(self, event.source.nick, command.split()[1]): # Insufficient rights.
  87. connection.privmsg(replyto, "Denied. You need to have at least halfop status in " + red + self.homechannel + reset + " or " + red + command.split()[1] + reset + ".")
  88. return
  89. user = command.split()[2]
  90. channel = command.split()[1]
  91. if len(command.split()) > 3: # Too many arguments.
  92. connection.privmsg(replyto, "Too many arguments. For help type " + blue + self.helpchar + "stopgreet" + reset + ".")
  93. return
  94. # Check for database record.
  95. result = self.db.one("SELECT id, stopgreet FROM joins WHERE LOWER(\"user\")=LOWER('" + user + "') AND user_network='" + self.network + "' AND LOWER(channel)=LOWER('" + channel + "') AND channel_network='" + self.network + "'")
  96. if not result: # No record in database.
  97. connection.action(replyto, "has not yet had the pleasure of greeting " + red + user + reset + " in " + red + channel + reset + ".")
  98. return
  99. if resume:
  100. stopgreet = False
  101. message = "has already every intention to greet "
  102. else:
  103. stopgreet = True
  104. message = "has already stopped greeting "
  105. if result[1] == stopgreet:
  106. connection.action(replyto, message + red + user + reset + " in " + red + channel + reset + ".")
  107. return
  108. print(str(stopgreet) + str(user) + str(channel))
  109. try:
  110. self.db.run("UPDATE joins SET stopgreet='" + str(stopgreet) + "' WHERE LOWER(\"user\")=LOWER('" + user + "') AND user_network='" + self.network + "' AND lower(channel)=LOWER('" + channel + "') AND channel_network='" + self.network + "'")
  111. except:
  112. connection.privmsg(replyto, "Failed to update database.")