on_mode.py 8.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111
  1. import fnmatch
  2. from irc.modes import parse_channel_modes
  3. from common.networkservices import ChanServ
  4. bold = "\x02"
  5. italic = "\x1D"
  6. underline = "\x1F"
  7. reverse = "\x16" # swap background and foreground colors ("reverse video")
  8. reset = "\x0F"
  9. blue = "\x0302"
  10. green = "\x0303"
  11. red = "\x0304"
  12. grey = "\x0314"
  13. def process_event(self, connection, event):
  14. print(event)
  15. if event.target == self.homechannel: # Home channel
  16. if any(mode in event.arguments[0][-1:] for mode in ("q", "a", "o", "h")): # Atleast halfop.
  17. connection.who(event.arguments[1]) # Get whorepy to update protectees.
  18. modes = parse_channel_modes(" ".join(event.arguments))
  19. for mode in modes:
  20. # Report.
  21. if not event.target == self.homechannel: # Not in home channel.
  22. for protectee in self.protectees:
  23. if mode[1] == "b" and fnmatch.fnmatch(self.protectees[protectee]['ident'], mode[2]) and mode[0] == "+": # Protectee banned.
  24. connection.privmsg(self.homechannel, red + protectee + reset + " banned from " + red + event.target + reset + " by " + red + event.source.nick + reset + ": " + green + mode[2])
  25. if mode[1] == "e" and fnmatch.fnmatch(self.protectees[protectee]['ident'], mode[2]) and mode[0] == "-": # Protectee's exception removed.
  26. connection.privmsg(self.homechannel, red + protectee + reset + " has had their exception removed from " + red + event.target + reset + " by " + red + event.source.nick + reset + ": " + green + mode[2])
  27. # Track channel keys.
  28. if mode[1] == "k": # Channel key changed.
  29. if mode[0] == "+": # Key set.
  30. self.db.run("UPDATE channels SET key='" + mode[2] + "' WHERE name='" + event.target + "' AND network='" + self.network + "'")
  31. else: # Key removed.
  32. self.db.run("UPDATE channels SET key=NULL WHERE name='" + event.target + "' AND network='" + self.network + "'")
  33. # Do not revert the actions of retalliate upon one self.
  34. if event.source.nick == connection.get_nickname():
  35. return
  36. # React.
  37. behaviour = self.db.one("SELECT aggressiveness FROM channels WHERE name='" + event.target + "' AND network='" + self.network + "'")
  38. for mode in modes:
  39. if behaviour == "passive": # Passive behaviour.
  40. if event.target == self.homechannel: # Home channel
  41. if mode[1] == "b" and fnmatch.fnmatch(self.protectees[connection.get_nickname()]['ident'], mode[2]) and mode[0] == "+": # Bot banned.
  42. ChanServ.unban(connection, event.target, connection.get_nickname())
  43. connection.privmsg("ChanServ", "UNBAN")
  44. connection.mode(event.target, "-b " + mode[2])
  45. elif behaviour == "defense_only": # Defensive only behaviour.
  46. if mode[1] == "b" and mode[0] == "+": # Ban.
  47. for protectee in self.protectees:
  48. if fnmatch.fnmatch(self.protectees[protectee]['ident'], mode[2]): # Protectee.
  49. ChanServ.unban(connection, event.target, protectee)
  50. connection.mode(event.target, "-b " + modes[1])
  51. elif mode[1] == "e" and mode[0] == "-": # Removed exception.
  52. for protectee in self.protectees:
  53. if fnmatch.fnmatch(self.protectees[protectee]['ident'], mode[2]): # Protectee.
  54. connection.mode(event.target, "+e " + mode[2])
  55. elif behaviour == "equal_retalliation": # Equal retaliatory behaviour.
  56. if modes[1] == "b" and mode[0] == "+": # Ban.
  57. for protectee in self.protectees:
  58. if fnmatch.fnmatch(self.protectees[protectee]['ident'], mode[2]): # Protectee.
  59. ChanServ.unban(connection, event.target, protectee)
  60. connection.mode(event.target, "-b " + mode[2])
  61. if protectee == connection.get_nickname(): # Bot banned.
  62. ChanServ.ban(connection, event.target, event.source.nick, "Aggression channel function = equal_retalliation.")
  63. else:
  64. ChanServ.ban(connection, event.target, event.source.nick, "Aggression channel function = equal_retalliation: " + protectee + " is an operator of " + connection.get_nickname() + ".")
  65. connection.mode(event.target, "+b " + event.source)
  66. elif mode[1] == "e" and mode[0] == "-": # Removed exception.
  67. for protectee in self.protectees:
  68. if fnmatch.fnmatch(self.protectees[protectee]['ident'], mode[2]): # Protectee.
  69. connection.mode(event.target, "+e " + mode[2])
  70. elif behaviour == "battlebot": # Battlebot behaviour.
  71. if mode[1] == "b" and mode[0] == "+": # Ban.
  72. for protectee in self.protectees:
  73. if fnmatch.fnmatch(self.protectees[protectee]['ident'], mode[2]): # Protectee.
  74. ChanServ.unban(connection, event.target, protectee)
  75. connection.mode(event.target, "-b " + mode[2])
  76. if protectee == connection.get_nickname(): # Bot banned.
  77. ChanServ.ban(connection, event.target, event.source.nick, "Aggression channel function = battlebot.")
  78. else:
  79. ChanServ.ban(connection, event.target, event.source.nick, "Aggression channel function = battlebot: " + protectee + " is an operator of " + connection.get_nickname() + ".")
  80. connection.mode(event.target, "+b " + event.source)
  81. connection.mode(event.target, "+e " + mode[2])
  82. ChanServ.akick_add(connection, event.target, event.source.nick)
  83. if protectee == connection.get_nickname(): # Bot banned.
  84. ChanServ.kick(connection, event.target, event.source.nick, "Aggression channel function = battlebot.")
  85. connection.kick(event.target, event.source.nick, "Aggression channel function = battlebot.")
  86. else:
  87. ChanServ.kick(connection, event.target, event.source.nick, "Aggression channel function = battlebot: " + protectee + " is an operator of " + connection.get_nickname() + ".")
  88. connection.kick(event.target, event.source.nick, "Aggression channel function = battlebot: " + protectee + " is an operator of " + connection.get_nickname() + ".")
  89. elif mode[1] == "e" and mode[0] == "-": # Removed exception.
  90. for protectee in self.protectees:
  91. if fnmatch.fnmatch(self.protectees[protectee]['ident'], mode[2]): # Protectee.
  92. if protectee == connection.get_nickname(): # Bot.
  93. ChanServ.ban(connection, event.target, event.source.nick, "Aggression channel function = battlebot.")
  94. else:
  95. ChanServ.ban(connection, event.target, event.source.nick, "Aggression channel function = battlebot: " + protectee + " is an operator of " + connection.get_nickname() + ".")
  96. print(event.target, "+b " + event.source)
  97. connection.mode(event.target, "+b " + event.source)
  98. connection.mode(event.target, "+e " + modes[mode]['value'])
  99. ChanServ.akick_add(connection, event.target, event.source.nick)
  100. if protectee == connection.get_nickname(): # Bot.
  101. ChanServ.kick(connection, event.target, event.source.nick, "Aggression channel function = battlebot..")
  102. connection.kick(event.target, event.source.nick, "Aggression channel function = battlebot.")
  103. else:
  104. ChanServ.kick(connection, event.target, event.source.nick, "Aggression channel function = battlebot: " + protectee + " is an operator of " + connection.get_nickname() + ".")
  105. connection.kick(event.target, event.source.nick, "Aggression channel function = battlebot: " + protectee + " is an operator of " + connection.get_nickname() + ".")