def run(self, event): """ Say a message into a channel or server/channel pair (in the format "{server,channel}"). Format: say <channel> <message> """ # Setting up variables line = event.command_args hallo_obj = event.server.hallo # See if server and channel are specified as parameters server_name = Commons.find_parameter("server", line) if server_name is not None: line = line.replace("server={}".format(server_name), "").strip() channel_name = Commons.find_parameter("channel", line) if channel_name is not None: line = line.replace("channel={}".format(channel_name), "").strip() # If channel_name is not found as a parameter, see if server/channel is given as a first argument pair. if channel_name is None: destination_pair = line.split()[0] line = line[len(destination_pair):].strip() destination_separators = ["->", ">", ",", ".", "/", ":"] for destination_separator in destination_separators: if destination_pair.count(destination_separator) != 0: server_name = destination_pair.split(destination_separator)[0] channel_name = destination_pair.split(destination_separator)[1] break if channel_name is None: channel_name = destination_pair # Get server_obj list from server_name server_objs = [] if server_name is None: server_objs = [event.server] else: # Create a regex query from their input server_regex = re.escape(server_name).replace(r"\*", ".*") server_list = hallo_obj.server_list for server_obj in server_list: if not server_obj.is_connected(): continue if re.match(server_regex, server_obj.name, re.IGNORECASE): server_objs.append(server_obj) # If server is not recognised or found, respond with an error if len(server_objs) == 0: return event.create_response("Unrecognised server.") # Get channel_obj list from server_obj and channel_name channel_objs = [] for server_obj in server_objs: channel_regex = re.escape(channel_name).replace(r"\*", ".*") channel_list = server_obj.channel_list for channel_obj in channel_list: if not channel_obj.in_channel: continue if re.match(channel_regex, channel_obj.name, re.IGNORECASE): channel_objs.append(channel_obj) # If no channels were found that match, respond with an error if len(channel_objs) == 0: return event.create_response("Unrecognised channel.") # Send message to all matching channels for channel_obj in channel_objs: event.server.send(EventMessage(event.server, channel_obj, None, line, inbound=False)) return event.create_response("Message sent.")
def run(self, line, user_obj, destination_obj=None): # Check for server name in input line server_name = Commons.find_parameter("server", line) if server_name is None: server_obj = user_obj.get_server() else: server_obj = user_obj.get_server().get_hallo().get_server_by_name(server_name) line = line.replace("server=" + server_name, "").strip() if server_obj is None: return "Error, invalid server specified." # Find channel object if line.strip() != "": channel_name = line.split()[0].lower() channel_obj = server_obj.get_channel_by_name(channel_name) else: if destination_obj.is_channel(): channel_name = destination_obj.get_name() channel_obj = destination_obj else: return "Error, I cannot leave a private chat." # Leave channel, provided hallo is in channel. if not channel_obj.is_in_channel(): return "Error, I'm not in that channel." server_obj.leave_channel(channel_obj) return "Left " + channel_name + "."
def run(self, event): # Check for server name in input line line = event.command_args server_name = Commons.find_parameter("server", line) if server_name is None: server_obj = event.server else: server_obj = event.server.hallo.get_server_by_name(server_name) line = line.replace("server={}".format(server_name), "").strip() if server_obj is None: return event.create_response("Error, invalid server specified.") # Find channel object if line.strip() != "": channel_name = line.split()[0].lower() channel_obj = server_obj.get_channel_by_name(channel_name) else: if event.channel is not None: channel_name = event.channel.name channel_obj = event.channel else: return event.create_response("Error, I cannot leave a private chat.") # Leave channel, provided hallo is in channel. if not channel_obj.in_channel: return event.create_response("Error, I'm not in that channel.") server_obj.leave_channel(channel_obj) return event.create_response("Left {}.".format(channel_name))
def run(self, event): # Check for server name in input line line = event.command_args server_name = Commons.find_parameter("server", line) if server_name is None: server_obj = event.server else: server_obj = event.server.hallo.get_server_by_name(server_name) line = line.replace("server={}".format(server_name), "").strip() if server_obj is None: return event.create_response("Invalid server specified.") # Get channel name channel_name = line.split()[0].lower() # Check for channel password channel_password = None if channel_name != line: channel_password = line[len(channel_name):] # Get channel object, set password channel_obj = server_obj.get_channel_by_name(channel_name) channel_obj.password = channel_password # Join channel if not already in channel. if channel_obj.in_channel: return event.create_response("I'm already in that channel.") server_obj.join_channel(channel_obj) return event.create_response("Joined {}.".format(channel_name))
def run(self, line, user_obj, destination_obj=None): line_clean = line.strip().lower() # Useful object hallo_obj = user_obj.get_server().get_hallo() # See if a server was specified. server_name = Commons.find_parameter("server", line) # Get server object. If invalid, use current if server_name is None: server_obj = user_obj.get_server() else: server_obj = hallo_obj.get_server_by_name(server_name) if server_obj is None: return "I don't recognise that server name." # Remove server name from line and trim line_clean = line_clean.replace("server=" + server_name, "").strip() # See if channel was specified with equals syntax channel_name = Commons.find_parameter("channel", line_clean) or Commons.find_parameter("chan", line_clean) # If not specified with equals syntax, check if just said. if channel_name is None: channel_name = line_clean if channel_name == "": if destination_obj is None or not destination_obj.is_channel(): return "I don't recognise that channel name." channel_name = destination_obj.get_name() # If they've specified all channels, display the server list. if channel_name in ["*", "all"]: output_string = "Users on " + server_obj.get_name() + ": " user_list = server_obj.get_user_list() output_string += ", ".join([user.get_name() for user in user_list if user.is_online()]) output_string += "." return output_string # Get channel object channel_obj = server_obj.get_channel_by_name(channel_name) # Get user list user_list = channel_obj.get_user_list() # Output output_string = "Users in " + channel_name + ": " output_string += ", ".join([user.get_name() for user in user_list]) output_string += "." return output_string
def run(self, event): line_clean = event.command_args.strip().lower() # Useful object hallo_obj = event.server.hallo # See if a server was specified. server_name = Commons.find_parameter("server", event.command_args) # Get server object. If invalid, use current if server_name is None: server_obj = event.server else: server_obj = hallo_obj.get_server_by_name(server_name) if server_obj is None: return event.create_response("I don't recognise that server name.") # Remove server name from line and trim line_clean = line_clean.replace("server={}".format(server_name), "").strip() # See if channel was specified with equals syntax channel_name = Commons.find_parameter("channel", line_clean) or Commons.find_parameter("chan", line_clean) # If not specified with equals syntax, check if just said. if channel_name is None: channel_name = line_clean if channel_name == "": if event.channel is None: return event.create_response("I don't recognise that channel name.") channel_name = event.channel.name # If they've specified all channels, display the server list. if channel_name in ["*", "all"]: user_list = server_obj.user_list output_string = "Users on {}: {}.".format(server_obj.name, ", ".join([user.name for user in user_list if user.online])) return event.create_response(output_string) # Get channel object channel_obj = server_obj.get_channel_by_name(channel_name) # Get user list user_list = channel_obj.get_user_list() # Output output_string = "Users in {}: {}.".format(channel_name, ", ".join([user.name for user in user_list])) return event.create_response(output_string)
def run(self, line, user_obj, destination_obj=None): # Check for server name in input line server_name = Commons.find_parameter("server", line) if server_name is None: server_obj = user_obj.get_server() else: server_obj = user_obj.get_server().get_hallo().get_server_by_name(server_name) line = line.replace("server=" + server_name, "").strip() if server_obj is None: return "Invalid server specified." # Get channel name channel_name = line.split()[0].lower() # Check for channel password channel_password = None if channel_name != line: channel_password = line[len(channel_name):] # Get channel object, set password channel_obj = server_obj.get_channel_by_name(channel_name) channel_obj.set_password(channel_password) # Join channel if not already in channel. if channel_obj.is_in_channel(): return "I'm already in that channel." server_obj.join_channel(channel_obj) return "Joined " + channel_name + "."
def edit_server_irc(self, line, server_obj, user_obj, destination_obj): """Processes arguments in order to edit an IRC server""" # Set all variables to none as default server_address, server_port = None, None # Find the URL, if specified url_regex = re.compile("(^|\s)(irc://)?(([a-z.]+\.[a-z]+)(:([0-9]+))?)(\s|$)", re.IGNORECASE) url_search = url_regex.search(line) if url_search is not None: line = line.replace(url_search.group(0), " ") server_address = url_search.group(4).lower() server_port = int(url_search.group(6)) # Find the server_address, if specified with equals notation server_address = Commons.find_parameter("server_address", line) or server_address # Find the server_port, if specified with equals notation server_port_param = Commons.find_parameter("server_port", line) if server_port_param is not None: try: server_port = int(server_port_param) except ValueError: return "Invalid port number." # If server_address or server_port are set, edit those and reconnect. if server_address is not None: server_obj.server_address = server_address if server_port is not None: server_obj.server_port = server_port # Get other parameters, if set. defaulting to whatever server defaults. auto_connect = Commons.string_to_bool(Commons.find_parameter("auto_connect", line)) or server_obj.get_auto_connect() server_nick = Commons.find_parameter("server_nick", line) or Commons.find_parameter("nick", line) or server_obj.get_nick() server_prefix = Commons.find_parameter("server_prefix", line) or Commons.find_parameter("prefix", line) or server_obj.get_prefix() full_name = Commons.find_parameter("full_name", line) or server_obj.get_full_name() nickserv_nick = Commons.find_parameter("nickserv_nick", line) or server_obj.get_nickserv_nick() nickserv_identity_command = Commons.find_parameter("nickserv_identity_command", line) or server_obj.get_nickserv_ident_command() nickserv_identity_response = Commons.find_parameter("nickserv_identity_response", line) or server_obj.get_nickserv_ident_response() nickserv_password = Commons.find_parameter("nickserv_password", line) or server_obj.get_nickserv_pass() # Set all the new variables server_obj.set_auto_connect(auto_connect) server_obj.set_nick(server_nick) server_obj.set_prefix(server_prefix) server_obj.set_full_name(full_name) server_obj.set_nickserv_nick(nickserv_nick) server_obj.set_nickserv_ident_command(nickserv_identity_command) server_obj.set_nickserv_ident_response(nickserv_identity_response) server_obj.get_nickserv_pass(nickserv_password) # If server address or server port was changed, reconnect. if server_port is not None or server_address is not None: server_obj.reconnect() return "Modified the IRC server: " + server_obj.get_name() + "."
def connect_to_new_server_irc(self, line, user_obj, destination_obj): """ Processes arguments in order to connect to a new IRC server :type line: str :type user_obj: Destination.User :type destination_obj: Destination.Destination """ # Get some handy objects current_server = user_obj.get_server() hallo_obj = current_server.get_hallo() # Set all variables to none as default server_address, server_port = None, None server_name = None # Find the URL, if specified url_regex = re.compile("(^|\s)(irc://)?(([a-z.]+\.[a-z]+)(:([0-9]+))?)(\s|$)", re.IGNORECASE) url_search = url_regex.search(line) if url_search is not None: line = line.replace(url_search.group(0), " ") server_address = url_search.group(4).lower() try: server_port = int(url_search.group(6)) except (ValueError, TypeError): server_port = None # Find the server_address, if specified with equals notation server_address = Commons.find_parameter("server_address", line) or server_address # Find the server_port, if specified with equals notation server_port_param = Commons.find_parameter("server_port", line) if server_port_param is not None: try: server_port = int(server_port_param) except (ValueError, TypeError): return "Error, invalid port number." # Check server_address and server_port are set if server_address is None: return "Error, No server address specified." if server_port is None and isinstance(current_server, ServerIRC): server_port = current_server.get_server_port() if server_port is None: return "Error, No server port specified." # Get server name server_name = Commons.find_any_parameter(["server_name", "name"], line) or server_name # if server name is null, get it from server_address if server_name is None: server_name = Commons.get_domain_name(server_address) # Get other parameters, if set. auto_connect_str = Commons.find_parameter("auto_connect", line) auto_connect = True if auto_connect_str is None else Commons.string_to_bool(auto_connect_str) server_nick = Commons.find_any_parameter(["server_nick", "nick"], line) or current_server.get_nick() server_prefix_arg = Commons.find_any_parameter(["server_prefix", "prefix"], line) if not server_prefix_arg: server_prefix = current_server.prefix else: server_prefix = None if Commons.is_string_null(server_prefix_arg) else server_prefix_arg full_name = Commons.find_parameter("full_name", line) or current_server.get_full_name() nickserv_nick = "nickserv" nickserv_identity_command = "status" nickserv_identity_resp = "^status [^ ]+ 3$" nickserv_password = None if isinstance(current_server, ServerIRC): nickserv_nick = current_server.get_nickserv_nick() nickserv_identity_command = current_server.get_nickserv_ident_command() nickserv_identity_resp = current_server.get_nickserv_ident_response() nickserv_password = current_server.get_nickserv_pass() nickserv_nick = Commons.find_parameter("nickserv_nick", line) or nickserv_nick nickserv_identity_command = Commons.find_parameter("nickserv_identity_command", line) or nickserv_identity_command nickserv_identity_resp = Commons.find_parameter("nickserv_identity_resp", line) or nickserv_identity_resp nickserv_password = Commons.find_parameter("nickserv_password", line) or nickserv_password # Create this serverIRC object new_server_obj = ServerIRC(hallo_obj, server_name, server_address, server_port) new_server_obj.set_auto_connect(auto_connect) new_server_obj.set_nick(server_nick) new_server_obj.set_prefix(server_prefix) new_server_obj.set_full_name(full_name) new_server_obj.set_nickserv_nick(nickserv_nick) new_server_obj.set_nickserv_ident_command(nickserv_identity_command) new_server_obj.set_nickserv_ident_response(nickserv_identity_resp) new_server_obj.set_nickserv_pass(nickserv_password) # Add user with same name on new server to all the same groups as current user new_user_nick = Commons.find_any_parameter(["user", "god"], line) or user_obj.get_name() new_user = new_server_obj.get_user_by_name(new_user_nick) for group in user_obj.user_group_list: new_user.add_user_group(group) # Add the new object to Hallo's list hallo_obj.add_server(new_server_obj) # Connect to the new server object. Thread(target=new_server_obj.run).start() return "Connected to new IRC server: " + new_server_obj.get_name() + "."