Ejemplo n.º 1
0
    def test_bot_not_found(self):

        pack = XDCCPack(IrcServer("irc.namibsun.net"), "nosuchbot", 2)
        results = self.downloader.download([pack])

        self.assertFalse(os.path.isfile(pack.get_filepath()))
        self.assertEqual(results[pack], "BOTNOTFOUND")
Ejemplo n.º 2
0
    def test_incorrect_file_sent(self):

        pack = XDCCPack(IrcServer("irc.namibsun.net"), "xdcc_servbot", 2)
        pack.set_original_filename("something_else.txt")

        results = self.downloader.download([pack])
        self.assertFalse(os.path.isfile(pack.get_filepath()))
        self.assertEqual(results[pack], "INCORRECT")
Ejemplo n.º 3
0
    def test_different_servers(self):

        packs_one = XDCCPack(IrcServer("irc.namibsun.net"), "xdcc_servbot", 2)
        pack_two = XDCCPack(IrcServer("irc.rizon.net"), "xdcc_servbot", 2)

        results = self.downloader.download([packs_one, pack_two])

        self.assertEqual(results[packs_one], "OK")
        self.assertEqual(results[pack_two], "OTHERSERVER")
Ejemplo n.º 4
0
    def test_file_existed(self):

        pack = XDCCPack(IrcServer("irc.namibsun.net"), "xdcc_servbot", 2)

        self.downloader.download([pack])
        self.assertTrue(os.path.isfile(pack.get_filepath()))

        results = self.downloader.download([pack])
        self.assertTrue(os.path.isfile(pack.get_filepath()))
        self.assertEqual(results[pack], "EXISTED")
Ejemplo n.º 5
0
            def on_welcome(self, conn, event):
                self.current_pack = XDCCPack(self.server, "xdcc_servbot", 2)
                self.pack_queue = []
                self.progress = Progress(1)

                with open("2_test.txt", 'w') as f:
                    f.write("Test")

                self.dcc_resume_requested = True
                self.connection.whois(self.current_pack.get_bot())
Ejemplo n.º 6
0
    def test_download_multiple_packs(self):

        progress = Progress(2)

        packs = [XDCCPack(IrcServer("irc.namibsun.net"), "xdcc_servbot", 2),
                 XDCCPack(IrcServer("irc.namibsun.net"), "xdcc_servbot", 3)]

        results = self.downloader.download(packs, progress)

        for pack in results:
            self.assertTrue(os.path.isfile(pack.get_filepath()))
            self.assertEqual(results[pack], "OK")

        self.assertEqual(progress.get_single_progress_percentage(), 100.0)
        self.assertEqual(progress.get_total_percentage(), 100.0)
Ejemplo n.º 7
0
    def test_move_selection_up_or_down(self):
        self.form.download_queue = [
            XDCCPack(IrcServer("irc.namibsun.net"), "xdcc_servbot", 1),
            XDCCPack(IrcServer("irc.namibsun.net"), "xdcc_servbot", 2),
            XDCCPack(IrcServer("irc.namibsun.net"), "xdcc_servbot", 3)
        ]
        self.form.refresh_download_queue()

        self.form.download_queue_list_widget.selectAll()
        QTest.mouseClick(self.form.up_arrow_button, Qt.LeftButton)

        self.form.download_queue_list_widget.selectAll()
        QTest.mouseClick(self.form.down_arrow_button, Qt.LeftButton)

        self.assertEqual(self.form.download_queue_list_widget.count(), 3)
Ejemplo n.º 8
0
    def test_download_multiple_packs_different_servers(self):

        progress = Progress(2)

        downloader = MultipleServerDownloader("random")

        downloader.download([
            XDCCPack(IrcServer("irc.namibsun.net"), "xdcc_servbot", 2),
            XDCCPack(IrcServer("namibsun.net"), "xdcc_servbot", 3)
        ], progress)

        self.assertTrue(os.path.isfile("2_test.txt"))
        self.assertTrue(os.path.isfile("3_test.txt"))

        self.assertEqual(progress.get_single_progress_percentage(), 100.0)
        self.assertEqual(progress.get_total_percentage(), 100.0)
Ejemplo n.º 9
0
    def test_download_packs(self):
        self.form.download_queue = [
            XDCCPack(IrcServer("irc.namibsun.net"), "xdcc_servbot", 1),
            XDCCPack(IrcServer("irc.namibsun.net"), "xdcc_servbot", 2),
            XDCCPack(IrcServer("irc.namibsun.net"), "xdcc_servbot", 3)
        ]
        self.form.refresh_download_queue()

        self.assertEqual(self.form.destination_edit.text(), os.getcwd())
        QTest.mouseClick(self.form.download_button, Qt.LeftButton)

        while self.form.downloading:
            pass

        self.assertTrue(os.path.isfile("1_test.txt"))
        self.assertTrue(os.path.isfile("2_test.txt"))
        self.assertTrue(os.path.isfile("3_test.txt"))
        self.form.show_download_complete_message_signal.emit("")
Ejemplo n.º 10
0
        class Tester(BotFinder):

            correct_channel_joined = False

            def on_welcome(self, conn, event):
                self.current_pack = XDCCPack(self.server, "HelloKitty", 1)
                self.connection.whois(self.current_pack.get_bot())

            # noinspection PyUnusedLocal
            def on_nosuchnick(self, conn, event):
                self.on_endofwhois(conn, event)

            # noinspection PyUnusedLocal
            def on_join(self, conn, event):
                if event.target.lower() == BotChannelMapper.map(
                        self.current_pack.get_bot()).lower():
                    self.correct_channel_joined = True
                    raise TestException()
Ejemplo n.º 11
0
    def test_quitting(self):

        packs = [XDCCPack(IrcServer("irc.namibsun.net"), "xdcc_servbot", 1)]

        downloader = MultipleServerDownloader("random")
        downloader.quit()
        downloader.download(packs)
        downloader.quit()

        self.assertFalse(os.path.isfile("1_test.txt"))
Ejemplo n.º 12
0
    def test_removing_queue_items(self):
        self.form.download_queue = [
            XDCCPack(IrcServer("irc.namibsun.net"), "xdcc_servbot", 1),
            XDCCPack(IrcServer("irc.namibsun.net"), "xdcc_servbot", 2),
            XDCCPack(IrcServer("irc.namibsun.net"), "xdcc_servbot", 3)
        ]
        self.form.refresh_download_queue()
        self.form.download_queue_list_widget.selectAll()

        self.assertEqual(self.form.download_queue_list_widget.count(), 3)
        self.assertEqual(len(self.form.download_queue), 3)
        self.assertEqual(
            len(self.form.download_queue_list_widget.selectedIndexes()), 3)

        QTest.mouseClick(self.form.left_arrow_button, Qt.LeftButton)

        self.assertEqual(self.form.download_queue_list_widget.count(), 0)
        self.assertEqual(len(self.form.download_queue), 0)
        self.assertEqual(
            len(self.form.download_queue_list_widget.selectedIndexes()), 0)
Ejemplo n.º 13
0
    def test_removing_pack_from_queue(self):
        self.form.download_queue = [
            XDCCPack(IrcServer("irc.namibsun.net"), "xdcc_servbot", 1)
        ]
        self.form.refresh_download_queue()
        self.assertEqual(1, self.form.download_queue_list_widget.count())

        self.form.download_queue_list_widget.selectAll()
        QTest.mouseClick(self.form.left_arrow_button, Qt.LeftButton)

        self.assertEqual(0, len(self.form.download_queue))
        self.assertEqual(0, self.form.download_queue_list_widget.count())
Ejemplo n.º 14
0
def find_subsplease_packs(search_phrase: str) -> List[XDCCPack]:
    """
    Method that conducts the xdcc pack search for subsplease.org

    :return: the search results as a list of XDCCPack objects
    """
    if not search_phrase:
        return []

    search_query = search_phrase.replace(" ", "%20")
    search_query = search_query.replace("!", "%21")

    url = "https://subsplease.org/xdcc/search.php?t=" + search_query
    scraper = cfscrape.create_scraper()
    results = scraper.get(url).text.split(";")

    packs = []
    for result in results:

        try:
            result = parse_result(result)
            botname = result["b"]
            filename = result["f"]
            filesize = int(result["s"])
            packnumber = int(result["n"])
            pack = XDCCPack(IrcServer("irc.rizon.net"), botname, packnumber)
            pack.set_filename(filename)
            pack.set_size(filesize * 1000 * 1000)
            packs.append(pack)

        except IndexError:  # In case the line is not parseable
            pass

    return packs
Ejemplo n.º 15
0
def find_xdcc_eu_packs(search_phrase: str) -> List[XDCCPack]:
    """
    Method that conducts the xdcc pack search for xdcc.eu

    :return: the search results as a list of XDCCPack objects
    """
    url = "https://www.xdcc.eu/search.php?searchkey=" + search_phrase
    response = requests.get(url)
    soup = BeautifulSoup(response.text, "html.parser")
    entries = soup.select("tr")
    entries.pop(0)

    packs = []
    for entry in entries:
        parts = entry.select("td")
        info = parts[1].select("a")[1]
        server = IrcServer(info["data-s"])
        pack_message = info["data-p"]
        bot, pack_number = pack_message.split(" xdcc send #")

        size = byte_string_to_byte_count(parts[5].text)
        filename = parts[6].text

        pack = XDCCPack(server, bot, int(pack_number))
        pack.set_size(size)
        pack.set_filename(filename)

        packs.append(pack)

    return packs
Ejemplo n.º 16
0
def find_horriblesubs_packs(search_phrase: str) -> List[XDCCPack]:
    """
    Method that conducts the xdcc pack search for xdcc.horriblesubs.info

    :return: the search results as a list of XDCCPack objects
    """
    if not search_phrase:
        return []

    search_query = search_phrase.replace(" ", "%20")
    search_query = search_query.replace("!", "%21")

    url = "http://xdcc.horriblesubs.info/search.php?t=" + search_query
    scraper = cfscrape.create_scraper()
    results = scraper.get(url).text.split(";")

    packs = []
    for result in results:

        try:
            botname = get_attribute(result, "b")
            filename = get_attribute(result, "f")
            filesize = get_attribute(result, "s")
            packnumber = get_attribute(result, "n")
            pack = XDCCPack(IrcServer("irc.rizon.net"), botname, packnumber)
            pack.set_filename(filename)
            pack.set_size(filesize)
            packs.append(pack)

        except IndexError:  # In case the line is not parseable
            pass
    return packs
Ejemplo n.º 17
0
            def on_welcome(self, conn, event):

                self.current_pack = XDCCPack(self.server, "xdcc_servbot", 3)
                self.pack_queue = []
                self.progress = Progress(1)

                event.arguments = []
                self.on_privnotice(conn, event)
                event.arguments = [
                    "You will have to re-send that,"
                    "to the bot that transferred the file."
                ]
                self.on_privnotice(conn, event)
Ejemplo n.º 18
0
    def test_download_while_downloading(self):
        self.form.download_queue = [
            XDCCPack(IrcServer("irc.namibsun.net"), "xdcc_servbot", 1),
            XDCCPack(IrcServer("irc.namibsun.net"), "xdcc_servbot", 3)
        ]
        self.form.refresh_download_queue()
        QTest.mouseClick(self.form.download_button, Qt.LeftButton)

        time.sleep(0.5)

        self.form.download_queue = [
            XDCCPack(IrcServer("irc.namibsun.net"), "xdcc_servbot", 2)
        ]
        self.form.refresh_download_queue()
        QTest.mouseClick(self.form.download_button, Qt.LeftButton)

        while self.form.downloading:
            pass

        self.assertTrue(os.path.isfile("1_test.txt"))
        self.assertFalse(os.path.isfile("2_test.txt"))
        self.assertTrue(os.path.isfile("3_test.txt"))
        self.form.show_download_complete_message_signal.emit("")
Ejemplo n.º 19
0
            def on_welcome(self, conn, event):

                self.progress = Progress(1)

                self.file = open("testfile.mkv", 'wb')
                self.file.write(b"test")
                self.filesize = 10000000

                self.current_pack = XDCCPack(self.server, "xdcc_servbot", 1)
                self.pack_queue = []

                self.logger.log = self.logging_handler

                self.on_dcc_disconnect(conn, event)
Ejemplo n.º 20
0
        class Tester(BotFinder):

            dummy_channel_joined = False

            def on_welcome(self, conn, event):
                self.current_pack = XDCCPack(self.server, "channelless_bot", 1)
                self.connection.whois(self.current_pack.get_bot())

            # noinspection PyUnusedLocal
            def on_nosuchnick(self, conn, event):
                self.on_endofwhois(conn, event)

            # noinspection PyUnusedLocal
            def on_join(self, conn, event):
                if event.source == self.user.get_name():
                    self.dummy_channel_joined = True
                    raise TestException()
Ejemplo n.º 21
0
def find_nibl_packs(search_phrase: str) -> List[XDCCPack]:
    """
    Searches for XDCC Packs matching the specified search string on nibl.co.uk

    :param search_phrase: The search phrase to search for
    :return:              The list of found XDCC Packs
    """

    # Prepare the search term, nibl.co.uk uses + symbols as spaces.
    split_search_term = search_phrase.split(" ")
    prepared_search_term = split_search_term[0]
    i = 1
    while i < len(split_search_term):
        prepared_search_term += "+" + split_search_term[i]
        i += 1

    # Get the data from the website

    url = "https://nibl.co.uk/bots.php?search=" + prepared_search_term
    html = requests.get(url).text

    print(html)

    content = BeautifulSoup(html, "html.parser")
    file_names = content.select(".filename")
    pack_numbers = content.select(".packnumber")
    bot_names = content.select(".name")
    file_sizes = content.select(".filesize")

    results = []
    i = 0  # We need a counter variable since we have four lists of data

    while i < len(file_names):

        # The filename has two links after it, which need to be cut out
        filename = file_names[i].text.rsplit(" \n", 1)[0]

        # The bot name has a link after it, which needs to be cut out
        print(bot_names)
        bot = bot_names[i].text.rsplit(" ", 1)[0]

        server = "irc.rizon.net"
        packnumber = int(pack_numbers[i].text)
        size = file_sizes[i].text

        result = XDCCPack(IrcServer(server), bot, packnumber)
        result.set_size(size)
        result.set_filename(filename)
        results.append(result)
        i += 1

    return results
Ejemplo n.º 22
0
    def test_from_message(self):
        single = XDCCPack.from_xdcc_message("/msg Bot1 xdcc send #1")
        _range = XDCCPack.from_xdcc_message("/msg Bot2 xdcc send #2-5")
        range_step = XDCCPack.from_xdcc_message("/msg Bot3 xdcc send #6-10;2")
        commas = XDCCPack.from_xdcc_message("/msg Bot4 xdcc send #11,111,1111")

        rizon = IrcServer("irc.rizon.net")

        self.assertEqual(single[0], XDCCPack(rizon, "Bot1", 1))

        for x in range(2, 6):
            self.assertEqual(_range[x - 2], XDCCPack(rizon, "Bot2", x))

        i = 0
        for x in range(6, 11, 2):
            self.assertEqual(range_step[i], XDCCPack(rizon, "Bot3", x))
            i += 1

        commas_value = "11"
        for pack in commas:
            self.assertEqual(pack, XDCCPack(rizon, "Bot4", int(commas_value)))
            commas_value += "1"
Ejemplo n.º 23
0
def find_ixirc_packs(search_phrase: str) -> List[XDCCPack]:
    """
    Searches for XDCC Packs matching the specified search string on ixirc.com
    Implementation courtesy of Jean Wicht <*****@*****.**>.

    :param search_phrase: The search phrase to search for
    :return:              The list of found XDCC Packs
    """

    if not search_phrase:
        return []

    packs: List[XDCCPack] = []
    page_id = 0
    # the number of pages of results will be set properly in the request below
    page_count = 42
    while page_id < page_count:
        request = requests.get(
            "https://ixirc.com/api/",
            params={
                "q": search_phrase,
                "pn": str(page_id)
            },
        )

        if request.status_code != 200:
            return packs

        data = request.json()
        page_count = int(data["pc"])

        if "results" not in data:
            # no results
            return []

        for result in data["results"]:
            if "uname" not in result:
                # bot not online
                continue

            server = IrcServer(result["naddr"], result["nport"])
            pack = XDCCPack(server, result["uname"], int(result["n"]))
            pack.set_filename(result["name"])
            pack.set_size(result["sz"])
            packs.append(pack)

        page_id += 1  # next page

    return packs
Ejemplo n.º 24
0
def find_namibsun_packs(search_phrase: str) -> List[XDCCPack]:
    """
    Searches for XDCC Packs matching the specified search string on
    irc.namibsun.net:8000

    :param search_phrase: The search phrase to search for
    :return:              The list of found XDCC Packs
    """

    soup = BeautifulSoup(
        requests.get("http://irc.namibsun.net:8000").text, "html.parser")
    content = soup.select(".content")

    all_packs = []
    for i, item in enumerate(content):
        if item.text == search_phrase:
            all_packs.append(
                XDCCPack(IrcServer("irc.namibsun.net"), "xdcc_servbot", i + 1))
            all_packs[len(all_packs) - 1].set_filename(item.text)

    return all_packs
Ejemplo n.º 25
0
 def on_welcome(self, conn, event):
     self.current_pack = XDCCPack(self.server, "channelless_bot", 1)
     self.connection.whois(self.current_pack.get_bot())
Ejemplo n.º 26
0
 def on_welcome(self, conn, event):
     self.current_pack = XDCCPack(self.server, "HelloKitty", 1)
     self.connection.whois(self.current_pack.get_bot())
Ejemplo n.º 27
0
def get_page_results(page_content: BeautifulSoup) -> List[XDCCPack]:
    """
    This parses a single ixIRC page to find all search results from that page

    :param page_content: The Beautifulsoup-parsed content of the page
    :return:             A list of XDCC Packs on that page
    """
    results = []
    packs = page_content.select("td")

    # Initialize the pack variables
    file_name = ""
    bot = ""
    server = ""
    pack_number = 0
    size = ""

    # Keeps track of which column the parser is currently working on
    column_count = 0

    # Counts how often the word "ago" was used,
    # which is used to keep track of on which
    # pack we currently are. Each pack has two instances of 'ago' occurring.
    ago_count = 0

    # The process is aborted whenever an invalid pack is encountered
    aborted = False

    # Flag that lets other parts of the loop know that
    # we are moving on to the next pack
    next_element = False

    # line_part is a x,y section of the rows and columns of the website.
    # We go through it in the order Left->Right, Top->Bottom
    for line_part in packs:

        if next_element and line_part.text == "":
            # Jumps to the next not-empty element
            # if we are currently jumping to the next pack
            continue

        elif next_element and not line_part.text == "":
            # We reached a new pack, start parsing the new pack
            next_element = False

        elif not next_element and line_part.text == "":
            # Invalid pack element if a string == "" in the middle of the pack,
            # abort the pack and jump to next element
            aborted = True

        elif "ago" in line_part.text and column_count > 6:
            # Counts the number of times 'ago' is seen by the parser.
            # The last two elements of a pack both end
            # with 'ago', which makes it ideal to use as a marker
            # for when a single pack element ends.
            # This only starts counting once we got all relevant information
            # from the pack itself (column_count > 6)
            # to avoid conflicts when the substring 'ago'
            # is contained inside the file name
            ago_count += 1

        # This gets the information from the pack and stores
        # them into variables.
        # This gets skipped if it has been established that the pack is invalid
        if not aborted:
            if column_count == 0:
                # File Name
                file_name = line_part.text
            elif column_count == 1:
                # Server Address
                server = "irc." + line_part.text.lower() + ".net"
            elif column_count == 2:
                # Channel Information, not needed due to /whois IRC queries
                pass
            elif column_count == 3:
                # Bot Name
                bot = line_part.text
            elif column_count == 4:
                # Pack Number
                pack_number = int(line_part.text)
            elif column_count == 5:
                pass  # This is the 'gets' section, we don't need that
            elif column_count == 6:
                size = line_part.text.replace("\xa0", " ").replace(" ", "")

        # Resets state after a pack was successfully parsed,
        # and adds xdcc pack to results
        if not aborted and ago_count == 2:
            ago_count = 0
            column_count = 0
            next_element = True

            # Generate XDCCPack and append it to the list
            result = XDCCPack(IrcServer(server), bot, pack_number)
            result.set_filename(file_name)
            result.set_size(byte_string_to_byte_count(size))
            results.append(result)

        # Resets state after invalid pack
        elif aborted and ago_count == 2:
            aborted = False
            ago_count = 0
            column_count = 0
            next_element = True

        if not next_element:
            # Only increment column_count in the middle of a pack,
            # not when we jump to the next pack element
            column_count += 1

    return results
Ejemplo n.º 28
0
 def on_welcome(self, conn, event):
     self.current_pack = XDCCPack(IrcServer("irc.namibsun.net"),
                                  "notexistingbot", 1)
     self.connection.whois("notexistingbot")
Ejemplo n.º 29
0
 def setUp(self):
     self.pack = XDCCPack(IrcServer("irc.namibsun.net"), "xdcc_servbot", 1)
Ejemplo n.º 30
0
    def test_network_error(self):

        pack = XDCCPack(IrcServer("gitlab.namibsun.net"), "xdcc_servbot", 2)
        results = XDCCDownloader("gitlab.namibsun.net", "random").\
            download([pack])
        self.assertEqual(results[pack], "NETWORKERROR")