| @@ -29,7 +29,7 @@ class Welcome(Command): | |||||
| """Welcome people who enter certain channels.""" | """Welcome people who enter certain channels.""" | ||||
| name = "welcome" | name = "welcome" | ||||
| commands = ["welcome", "greet"] | commands = ["welcome", "greet"] | ||||
| hooks = ["join", "msg"] | |||||
| hooks = ["join", "part", "msg"] | |||||
| def setup(self): | def setup(self): | ||||
| try: | try: | ||||
| @@ -40,12 +40,13 @@ class Welcome(Command): | |||||
| self._throttle = False | self._throttle = False | ||||
| self._last_join = 0 | self._last_join = 0 | ||||
| self._pending = [] | |||||
| def check(self, data): | def check(self, data): | ||||
| if data.is_command and data.command in self.commands: | if data.is_command and data.command in self.commands: | ||||
| return True | return True | ||||
| try: | try: | ||||
| if data.line[1] != "JOIN": | |||||
| if data.line[1] != "JOIN" and data.line[1] != "PART": | |||||
| return False | return False | ||||
| except IndexError: | except IndexError: | ||||
| pass | pass | ||||
| @@ -58,6 +59,11 @@ class Welcome(Command): | |||||
| self.process_command(data) | self.process_command(data) | ||||
| return | return | ||||
| if data.line[1] == "PART": | |||||
| if (data.chan, data.nick) in self._pending: | |||||
| self._pending.remove((data.chan, data.nick)) | |||||
| return | |||||
| this_join = time() | this_join = time() | ||||
| if this_join - self._last_join < 5: | if this_join - self._last_join < 5: | ||||
| self._throttle = True | self._throttle = True | ||||
| @@ -77,11 +83,20 @@ class Welcome(Command): | |||||
| def _callback(self, data): | def _callback(self, data): | ||||
| """Internal callback function.""" | """Internal callback function.""" | ||||
| self._pending.append((data.chan, data.nick)) | |||||
| sleep(2) | sleep(2) | ||||
| if data.chan in self.disabled or self._throttle: | if data.chan in self.disabled or self._throttle: | ||||
| return | return | ||||
| if (data.chan, data.nick) not in self._pending: | |||||
| return | |||||
| self.say(data.chan, self.channels[data.chan].format(nick=data.nick)) | self.say(data.chan, self.channels[data.chan].format(nick=data.nick)) | ||||
| try: | |||||
| self._pending.remove((data.chan, data.nick)) | |||||
| except ValueError: | |||||
| pass # Could be a race condition | |||||
| def process_command(self, data): | def process_command(self, data): | ||||
| """Handle this when it is an explicit command, not a channel join.""" | """Handle this when it is an explicit command, not a channel join.""" | ||||
| if data.args: | if data.args: | ||||