from commands.common import CommandHelpers as CH bold = "\x02" italic = "\x1D" underline = "\x1F" reverse = "\x16" # swap background and foreground colors ("reverse video") reset = "\x0F" blue = "\x0302" green = "\x0303" red = "\x0304" grey = "\x0314" def do_command(self, connection, event): cmdtype, trigger, command, replyto = CH.disect_command(self, event) # Ignore channel commands from users that do not have at least voice in homechannel or operator status in target channel. if event.type == "pubmsg": # It's a channel message. if not self.channels[self.homechannel].is_owner(event.source.nick) and not self.channels[self.homechannel].s_admin(event.source.nick) and not self.channels[self.homechannel].is_oper(event.source.nick) and not self.channels[event.target].is_owner(event.source.nick) and not self.channels[event.target].is_admin(event.source.nick) and not self.channels[event.target].is_oper(event.source.nick): # Does not have at least voiced status in homechannel or operator status in target channel. return if command == "cmd" or command == "commands": if cmdtype == "cmd": connection.privmsg(replyto, grey + "Admin: " + CH.ccc(self, "channelfunctions", {"homechan": "oper", "chan": "oper"}, event) + CH.ccc(self, "join", {"homechan": "oper", "chan": None}, event) + CH.ccc(self, "die", {"homechan": "admin", "chan": None}, event) + CH.ccc(self, "reconnect", {"homechan": "oper", "chan": None}, event) + CH.ccc(self, "recovernick", {"homechan": "oper", "chan": None}, event)+ CH.ccc(self, "msg", {"homechan": "oper", "chan": "oper"}, event) + CH.ccc(self, "act", {"homechan": "oper", "chan": "oper"}, event)[:-2] + ".") elif command.split()[0] == "channelfunctions": if cmdtype == "help": #Display help text. # Help code block first, as it is impossible to predict for what channel a later command is going to be issued. Rights filtering after help test. if len(command.split()) is not 1: return connection.privmsg(replyto, "Display or toggle the status channel functions. Channel, function and value optional.") connection.privmsg(replyto, grey + "Usage: " + blue + "!channelfunctions " + red + italic + "channel " + reset + italic + "function value") elif cmdtype == "cmd": if len(command.split()) == 1: # No arguments. if event.target == connection.get_nickname(): # Command issued via PM. connection.privmsg(replyto, "Nothing to display, Specify a channel.") else: # Command issued as channel message. message = CH.get_channelfunctions(self, event.target) connection.privmsg(replyto, message) elif len(command.split()) == 2: # One argument. if command.split()[1] in self.channels: # Info requested on specific channel. message = CH.get_channelfunctions(self, command.split()[1]) connection.privmsg(replyto, message) else: # First argument is not a channel the bot inhabits. connection.privmsg(replyto, command.split()[1] + " is not a channel I inhabit. For help type " + blue + self.helpchar + "channelfunctions" + reset + ".") elif len(command.split()) == 3: # Two arguments. if event.target == connection.get_nickname(): # Command issued via PM. connection.privmsg(replyto, "One or three arguments required. For help type " + blue + self.helpchar + "channelfunctions" + reset + ".") else: # Command issued via channel. if not CH.is_channelfunction(self, command.split()[1]): # First argument is not a channelfunction. connection.privmsg(replyto, command.split()[1] + " is not a channel function. For help type " + blue + self.helpchar + "channelfunctions" + reset + ".") return if not command.split()[2].lower() in ["on", "off"]: # Second argument is not "on" or "off". connection.privmsg(replyto, "The value of this channel function can only be \"on\" or \"off\". For help type " + blue + self.helpchar + "channelfunctions" + reset + ".") return if not self.channels[self.homechannel].is_owner(event.source.nick) and not self.channels[self.homechannel].is_admin(event.source.nick) and not self.channels[self.homechannel].is_oper(event.source.nick) and not self.channels[event.target].is_owner(event.source.nick) and not self.channels[event.target].is_admin(event.source.nick) and not self.channels[event.target].is_oper(event.source.nick): # Does not have operator status or higher in target or home channel. connection.privmsg(replyto, "Denied. You need to have at least operator status in " + red + event.target + reset + " or " + red + self.homechannel + reset + ".") return self.db.run("UPDATE channels SET " + command.split()[1] + "='" + command.split()[2].lower() + "' WHERE name='" + event.target + "' AND network='" + self.network + "'") elif len(command.split()) == 4: # Three arguments. if not command.split()[1] in self.channels: # Bot does not inhabit channel to be altered. connection.privmsg(replyto, command.split()[1] + " is not a channel I inhabit. For help type " + blue + self.helpchar + "channelfunctions" + reset + ".") return if not CH.is_channelfunction(self, command.split()[2]): # Function does not exist. connection.privmsg(replyto, command.split()[2] + " is not a valid channel function. For a list help type: " + blue + self.cmdchar + "channelfunctions" + red + italic + "channel") return if not command.split()[3] in ["on", "off"]: # Third argument is not "on" or "off". connection.privmsg(replyto, "The value of this channel function can only be \"on\" or \"off\". For help type " + blue + self.helpchar + "channelfunctions" + reset + ".") return if not self.channels[self.homechannel].is_owner(event.source.nick) and not self.channels[self.homechannel].is_admin(event.source.nick) and not self.channels[self.homechannel].is_oper(event.source.nick) and not self.channels[command.split()[1]].is_owner(event.source.nick) and not self.channels[command.split()[1]].is_admin(event.source.nick) and not self.channels[command.split()[1]].is_oper(event.source.nick): # Does not have operator status or higher in target or home channel. connection.privmsg(replyto, "Denied. You need to have at least operator status in " + red + event.target + reset + " or " + red + self.homechannel + reset + ".") return try: self.db.run("UPDATE channels SET " + command.split()[2] + "='" + command.split()[3] + "' WHERE name='" + command.split()[1] + "' AND network='" + self.network + "'") except: connection.privmsg(replyto, "Error, database record not updated.") return else: connection.privmsg(replyto, "Too many arguments. For help type " + blue + self.helpchar + "channelfunctions" + reset + ".") elif command.split()[0] == "join": if not self.channels[self.homechannel].is_owner(event.source.nick) and not self.channels[self.homechannel].is_admin(event.source.nick) and not self.channels[self.homechannel].is_oper(event.source.nick): connection.privmsg(replyto, "Denied, you need to have admin (super operator) status or higher in " + red + self.homechannel + reset + ".") return if cmdtype == "help": #Display help text. if len(command.split()) is not 1: return connection.privmsg(replyto, "Make " + connection.get_nickname() + " join a channel. Password optional.") connection.privmsg(replyto, grey + "Usage: " + blue + "!join " + red + italic + "channel " + reset + italic + "password") elif cmdtype == "cmd": try: channel = command.split()[1] except IndexError: connection.privmsg(replyto, "Specify channel. For help type: " + blue + self.helpchar + "join") return try: key = command.split(maxsplit=2)[2] except IndexError: connection.join(channel) return print(channel + " | " + key) connection.join(channel, key=key) elif command.split()[0] == "die": if not self.channels[self.homechannel].is_owner(event.source.nick) and not self.channels[self.homechannel].is_admin(event.source.nick): connection.privmsg(replyto, "Denied, you need to have admin (super operator) status or higher in " + red + self.homechannel + reset + ".") return if cmdtype == "help": # Display help text. if len(command.split()) is not 1: return connection.privmsg(replyto, "Kill " + connection.get_nickname() + ". Optionally with reason.") connection.privmsg(replyto, grey + "Usage: " + blue + "!die " + reset + italic + "reason") elif cmdtype == "cmd": if len(command.split()) == 1: self.die(msg = "Killed by " + event.source.nick) else: self.die(msg = "[" + event.source.nick + "] " + command.split(maxsplit=1)[1]) elif command.split()[0] == "reconnect": if not self.channels[self.homechannel].is_owner(event.source.nick) and not self.channels[self.homechannel].is_admin(event.source.nick) and not self.channels[self.homechannel].is_oper(event.source.nick): connection.privmsg(replyto, "Denied, you need to have operator status or higher in " + red + self.homechannel + reset + ".") return if cmdtype == "help": # Display help text. if len(command.split()) is not 1: return connection.privmsg(replyto, "Reconnect " + connection.get_nickname() + ". Reason optional.") connection.privmsg(replyto, grey + "Usage: " + blue + "!reconnect " + reset + italic + "reason") elif cmdtype == "cmd": if len(command.split()) == 1: self.disconnect(msg = "reconnect requested by " + event.source.nick) else: self.disconnect(msg = "[" + event.source.nick + "] " + command.split(maxsplit=1)[1]) elif command.split()[0] == "recovernick": if not self.channels[self.homechannel].is_owner(event.source.nick) and not self.channels[self.homechannel].is_admin(event.source.nick) and not self.channels[self.homechannel].is_oper(event.source.nick) and not self.channels[self.homechannel].is_halfop(event.source.nick) and not self.channels[self.homechannel].is_voiced(event.source.nick): connection.privmsg(replyto, "Denied, you need to have voiced status or higher in " + red + self.homechannel + reset + ".") return if cmdtype == "help": # Display help text. if len(command.split()) is not 1: return connection.privmsg(replyto, "Let " + connection.get_nickname() + " try to recover " + connection.nickname + " as nickname.") elif cmdtype == "cmd": if connection.get_nickname() == connection.nickname: connection.action(replyto, "is already named " + red + connection.nickname + reset + ".") return from common.networkservices import NickServ NickServ.recover_nick(connection, self.password) elif command.split()[0] == "msg" or command.split(maxsplit=1)[0] == "act": if cmdtype == "help": #Display help text. if len(command.split()) is not 1: return if command.split(maxsplit=1)[0] == "act": message = "Let " + connection.get_nickname() + " send an action to a channel." arguments = "action-message" else: message = "Let " + connection.get_nickname() + "send a message to a channel." arguments = "name message" connection.privmsg(replyto, message) connection.privmsg(replyto, grey + "Usage: " + blue + "!" + command.split(maxsplit=1)[0] + " " + reset + italic + arguments) elif cmdtype == "cmd": # Parse user input. try: destination = trigger.split()[1] except IndexError: # User did not specify a destination. connection.privmsg(replyto, "Destination not specified. For help type: " + blue + self.helpchar + command.split(maxsplit=1)[0]) return try: message = trigger.split(maxsplit=2)[2] except IndexError: # User did not specify a message. connection.privmsg(replyto, "Message not specified. For help type: " + blue + self.helpchar + command.split(maxsplit=1)[0]) return # Send the message if user has owner status in the home channel. if self.channels[self.homechannel].is_owner(event.source.nick): if destination == connection.get_nickname(): connection.privmsg(replyto, "To prevent dying in a loop I shall not message myself.") return if command.split(maxsplit=1)[0] == "act": connection.action(destination, message) else: connection.privmsg(destination, message) # Reply error when bot does not inhabit destination channel. elif destination not in self.channels: connection.action(replyto, "does not inhabit " + red + destination + reset + ".") # Send message if user has at least operator status the home channel or the channel the message is intended for. elif self.channels[self.homechannel].is_owner(event.source.nick) or self.channels[self.homechannel].is_admin(event.source.nick) or self.channels[self.homechannel].is_oper(event.source.nick) or self.channels[destination].is_owner(event.source.nick) or self.channels[destination].is_admin(event.source.nick) or self.channels[destination].is_oper(event.source.nick): if command.split(maxsplit=1)[0] == "act": connection.action(destination, message) else: connection.privmsg(destination, message) # Reply error if user is not operator of destination channel. else: connection.privmsg(replyto, "Denied, you need to be an operator of " + red + destination + reset +".")