def url_image(self, url_address, page_opener, page_request, page_type): """Handling direct image links""" # Get the website name url_site = Commons.get_domain_name(url_address).lower() # If website name is speedtest or imgur, hand over to those handlers if url_site == "speedtest": return self.site_speedtest(url_address, page_opener, page_type) if url_site == "imgur": return self.site_imgur(url_address, page_opener, page_type) # Image handling image_data = page_opener.open(page_request).read() image_width, image_height = self.get_image_size(image_data) image_size = len(image_data) image_size_str = self.file_size_to_string(image_size) return "Image: {} ({}px by {}px) {}.".format(page_type, image_width, image_height, image_size_str)
def test_domain_name(url, domain): assert Commons.get_domain_name(url) == domain
def connect_to_new_server_irc(self, line, event): """ Processes arguments in order to connect to a new IRC server :type line: str :type event: EventMessage """ # Get some handy objects current_server = event.server hallo_obj = current_server.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( r"(^|\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.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) if new_user_nick is False: # TODO: check user exists on server, ask server? new_user = new_server_obj.get_user_by_address( event.user.address, event.user.name) else: new_user = new_server_obj.get_user_by_address( new_user_nick.lower(), new_user_nick) if new_user is None: return 'Could not find a user by the name specified ("{}") on the new server.'.format( new_user_nick) for group in event.user.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. new_server_obj.start() return "Connected to new IRC server: {}.".format(new_server_obj.name)
def passive_run(self, event, hallo_obj): """Replies to an event not directly addressed to the bot.""" if not isinstance(event, EventMessage): return if event.server.type == Server.TYPE_TELEGRAM: return # Get hallo object for stuff to use self.hallo_obj = hallo_obj # Search for a link url_regex = re.compile( r"\b((https?://|www.)[-A-Z0-9+&?%@#/=~_|$:,.]*[A-Z0-9+&@#/%=~_|$])", re.I) url_search = url_regex.search(event.text) if not url_search: return None # Get link address url_address = url_search.group(1) # Add protocol if missing if "://" not in url_address: url_address = "http://" + url_address # Ignore local links. if ("127.0.0.1" in url_address or "192.168." in url_address or "10." in url_address or "172." in url_address): return None # Get page info page_request = urllib.request.Request(url_address) page_request.add_header( "User-Agent", "Mozilla/5.0 (X11; Linux i686; rv:23.0) Gecko/20100101 Firefox/23.0", ) page_opener = urllib.request.build_opener() page_info = str(page_opener.open(page_request).info()) if "Content-Type:" in page_info: page_type = page_info.split()[ page_info.split().index("Content-Type:") + 1] else: page_type = "" # Get the website name url_site = Commons.get_domain_name(url_address).lower() # Get response if link is an image if "image" in page_type: return event.create_response( self.url_image(url_address, page_opener, page_request, page_type)) # Get a response depending on the website output = None site_readers = { "ebay": self.site_ebay, "imdb": self.site_imdb, "imgur": self.site_imgur, "speedtest": self.site_speedtest, "youtube": self.site_youtube, "youtu": self.site_youtube, } if url_site in site_readers: output = site_readers[url_site](url_address, page_opener, page_request) # If other url, return generic URL response if output is None: output = self.url_generic(url_address, page_opener, page_request) return None if output is None else event.create_response(output)