Ejemplo n.º 1
0
 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)
Ejemplo n.º 2
0
def test_domain_name(url, domain):
    assert Commons.get_domain_name(url) == domain
Ejemplo n.º 3
0
 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)
Ejemplo n.º 4
0
 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)