示例#1
0
def main_window():

    splash_root.destroy()
    root = tk.Tk()
    root.title("Opinaika bot v. 1.9.9")
    root.geometry('1072x772+450+75')
    root.iconbitmap('img\\lain_favicon.ico')
    root.resizable(False, False)
    root.focus_force()

    # CHROME

    def chrome_script():

        swe_sanasto = "http://www.opinaika.fi/opinaika/so.cfm?s=aihioselaus&va=62416"
        eng_sanasto = "https://www.opinaika.fi/opinaika/so.cfm?s=aihioselaus&va=59994"
        ger_sanasto = "https://www.opinaika.fi/opinaika/so.cfm?s=aihioselaus&va=64625"
        spa_sanasto = "https://www.opinaika.fi/opinaika/so.cfm?s=aihioselaus&va=56267"
        rus_sanasto = "https://www.opinaika.fi/opinaika/so.cfm?s=aihioselaus&va=36509"
        fre_sanasto = "https://www.opinaika.fi/opinaika/so.cfm?s=aihioselaus&va=66922"
        ita_sanasto = "https://www.opinaika.fi/opinaika/so.cfm?s=aihioselaus&va=108152"
        custom_sanasto = url_entry_var.get()

        chrome_path = "img\\chromedriver.exe"
        driver = webdriver.Chrome(chrome_path, options=Options())

        if url_check_var.get() == 1 and custom_sanasto != "":
            global user_sanasto
            user_sanasto = custom_sanasto
        else:
            if url_check_var.get() == 1:
                write("Url field empty!\nUsing selected language sanasto")
            user_sanasto = lang_variable.get()

        if user_sanasto == str(custom_sanasto):
            driver.get(str(custom_sanasto))

        elif user_sanasto == "Swedish":
            driver.get(swe_sanasto)

        elif user_sanasto == "English":
            driver.get(eng_sanasto)

        elif user_sanasto == "German":
            driver.get(ger_sanasto)

        elif user_sanasto == "Spanish":
            driver.get(spa_sanasto)

        elif user_sanasto == "Russian":
            driver.get(rus_sanasto)

        elif user_sanasto == "French":
            driver.get(fre_sanasto)

        elif user_sanasto == "Italian":
            driver.get(ita_sanasto)

        print(user_sanasto)
        write(user_sanasto)

        human_state = human_var.get()

        if human_state == 1:
            print("Humanlike behaviour enabled")
            write("Humanlike behaviour enabled")

        driver.maximize_window()

        time.sleep(0.2)

        # HUMALIKE BEHAVIOUR

        global piste_threshold_reached
        piste_threshold_reached = False

        def human_behaviour():

            piste_threshold = human_scale.get()
            tehtyja_kohtia = driver.find_element_by_xpath(
                '//*[@id="divKohtiaTehty"]').text

            if len(tehtyja_kohtia) < 10:
                pisteet = 0
            else:
                pisteet = tehtyja_kohtia.split("Pisteet: ",
                                               1)[1].split(".", 1)[0]
                print(pisteet + " points")
                write(pisteet + " points")

                if int(pisteet) >= int(piste_threshold):
                    time.sleep(0.5)
                    global piste_threshold_reached
                    piste_threshold_reached = True
                    return

        # ABORT HUMAN
        def abort():
            driver.execute_script("window.scrollTo(0, 1080);")
            time.sleep(0.5)
            driver.find_element_by_xpath(
                '//*[@id="divAihioHarjoittelu"]/center/div').click()
            time.sleep(0.2)

        # END OF EXERCISE

        def end_of_exercise():

            if str(url_type_var.get()
                   ) == "Kurssitehtävät" and custom_sanasto != "":
                driver.execute_script("window.history.go(-1)")
            else:
                if len(
                        driver.find_elements_by_class_name(
                            "vaihdaosoite.loppupalautenavigointi")) > 0:
                    (driver.find_elements_by_class_name(
                        "vaihdaosoite.loppupalautenavigointi")[0]).click()

                else:
                    driver.find_element_by_class_name(
                        "selainpalaa.loppupalautenavigointi").click()

            global piste_threshold_reached
            piste_threshold_reached = False

        # LOGIN #

        username_input = username.get()
        password_input = password.get()

        def login():
            username = driver.find_element_by_xpath(
                '/html/body/center/table/tbody/tr[3]/td/center/form/table/tbody/tr[2]/td[2]/input'
            )
            password = driver.find_element_by_xpath(
                '/html/body/center/table/tbody/tr[3]/td/center/form/table/tbody/tr[3]/td[2]/input'
            )
            login_button = driver.find_element_by_xpath(
                '/html/body/center/table/tbody/tr[3]/td/center/form/table/tbody/tr[4]/td[2]/input'
            )
            username.click()
            username.clear()
            username.send_keys(username_input)
            time.sleep(0.2)
            password.click()
            password.clear()
            password.send_keys(password_input)

            time.sleep(0.2)

            login_button.click()

        login()
        time.sleep(1.5)

        # TUTUSTUMINEN

        def tutustuminen():

            driver.execute_script("window.scrollTo(0, 250);")
            time.sleep(0.2)
            tutut = driver.find_elements_by_class_name(
                "painettava.tutustumisrivioletus.perussanasto")
            for i in range(len(tutut)):
                (tutut[i]).click()

            time.sleep(10)
            driver.execute_script("window.scrollTo(0, 1080);")
            time.sleep(0.5)

            end_of_exercise()

            time.sleep(0.5)
            print("Exercise done!")
            write("Exercise done!")

        # SANASANELU

        def sanasanelu():

            sanat = driver.find_elements_by_class_name(
                "harjoituskohta.kirjoitettava.playsoundonfocus")

            for i in range(len(sanat)):

                if human_state == 1 and piste_threshold_reached == True:
                    abort()
                    break
                elif human_state == 1 and piste_threshold_reached == False:
                    human_behaviour()
                    if piste_threshold_reached == True:
                        abort()
                        break

                sanelu_oikea_vastaus = (
                    sanat[i]).get_attribute("data-oikeatvastaukset").split(
                        '"text":"', 1)[1].split('"}', 1)[0]
                print(sanelu_oikea_vastaus)
                write(sanelu_oikea_vastaus)
                (sanat[i]).send_keys(sanelu_oikea_vastaus)
                (sanat[i]).send_keys(Keys.ENTER)

            time.sleep(10)
            driver.execute_script("window.scrollTo(0, 1080);")
            time.sleep(0.5)

            end_of_exercise()

            time.sleep(0.5)
            print("Exercise done!")
            write("Exercise done!")

        # AUKKOLAUSE

        def aukkolause():

            lauseet = driver.find_elements_by_class_name(
                "harjoituskohta.kirjoitettava.painettava")

            for i in range(len(lauseet)):

                if human_state == 1 and piste_threshold_reached == True:
                    abort()
                    break
                elif human_state == 1 and piste_threshold_reached == False:
                    human_behaviour()
                    if piste_threshold_reached == True:
                        abort()
                        break

                aukkolause_oikea_vastaus = (
                    lauseet[i]).get_attribute("data-oikeatvastaukset").split(
                        '"text":"', 1)[1].split('"}', 1)[0]
                print(aukkolause_oikea_vastaus)
                write(aukkolause_oikea_vastaus)
                (lauseet[i]).send_keys(aukkolause_oikea_vastaus)
                (lauseet[i]).send_keys(Keys.ENTER)

            time.sleep(10)
            driver.execute_script("window.scrollTo(0, 1080);")
            time.sleep(0.5)

            end_of_exercise()

            time.sleep(0.5)
            print("Exercise done!")
            write("Exercise done!")

        # AUKKOSANA

        def aukkosana():

            aukot = driver.find_elements_by_class_name(
                "harjoituskohta.kirjoitettava")

            for i in range(len(aukot)):

                if human_state == 1 and piste_threshold_reached == True:
                    abort()
                    break
                elif human_state == 1 and piste_threshold_reached == False:
                    human_behaviour()
                    if piste_threshold_reached == True:
                        abort()
                        break

                aukkosana_oikea_vastaus = (
                    aukot[i]).get_attribute("data-oikeatvastaukset").split(
                        '"text":"', 1)[1].split('"}]}', 1)[0]
                print(aukkosana_oikea_vastaus)
                write(aukkosana_oikea_vastaus)
                (aukot[i]).send_keys(aukkosana_oikea_vastaus)
                (aukot[i]).send_keys(Keys.ENTER)

            time.sleep(10)
            driver.execute_script("window.scrollTo(0, 1080);")
            time.sleep(0.5)

            end_of_exercise()

            time.sleep(0.5)
            print("Exercise done!")
            write("Exercise done!")

        # KUVAVALINTA

        def kuvavalinta():

            driver.execute_script("window.scrollTo(0, 180);")
            kuvat = driver.find_elements_by_xpath(
                "//*[@data-ratkaisupainallus='1']")
            for i in range(len(kuvat)):

                if human_state == 1 and piste_threshold_reached == True:
                    abort()
                    break
                elif human_state == 1 and piste_threshold_reached == False:
                    human_behaviour()
                    if piste_threshold_reached == True:
                        abort()
                        break

                (kuvat[i]).click()
                time.sleep(5)

            time.sleep(10)
            driver.execute_script("window.scrollTo(0, 1080);")
            time.sleep(0.5)

            end_of_exercise()

            time.sleep(0.5)
            print("Exercise done!")
            write("Exercise done!")

        # RISTIKKO

        def ristikko():

            driver.execute_script("window.scrollTo(0, 509);")
            ristit = driver.find_elements_by_class_name(
                "harjoituskohta.merkkikirjoitus.vrr")
            risti = driver.find_elements_by_class_name(
                "harjoituskohta.merkkikirjoitus.prr")

            # PYSTY
            for i in range(len(risti)):
                ristikko_oikea_vastaus_2 = (
                    risti[i]).get_attribute("data-oikeamerkki")
                (risti[i]).send_keys(ristikko_oikea_vastaus_2)

            time.sleep(0.2)

            # VAAKA
            for i in range(len(ristit)):

                if human_state == 1 and piste_threshold_reached == True:
                    abort()
                    break
                elif human_state == 1 and piste_threshold_reached == False:
                    human_behaviour()
                    if piste_threshold_reached == True:
                        abort()
                        break

                ristikko_oikea_vastaus = (
                    ristit[i]).get_attribute("data-oikeamerkki")
                (ristit[i]).send_keys(ristikko_oikea_vastaus)

            time.sleep(10)
            driver.execute_script("window.scrollTo(0, 1080);")
            time.sleep(0.5)

            end_of_exercise()

            time.sleep(0.5)
            print("Exercise done!")
            write("Exercise done!")

        # PIILOSANA

        def piilosana():

            piilot = driver.find_elements_by_class_name(
                'painettava.valittavaruutu.ratkaisematonpsruutu')

            pysty_alku = []
            pysty_loppu = []

            vaaka_alku = []
            vaaka_loppu = []

            for i in piilot:
                p_a_value = int((i).get_attribute('data-pystysananalku'))
                if p_a_value > -1:
                    vaaka_alku.append(i)

            for i in piilot:
                p_l_value = int((i).get_attribute('data-pystysananloppu'))
                if p_l_value > -1:
                    vaaka_loppu.append(i)

            for i in piilot:
                v_a_value = int((i).get_attribute('data-vaakasananalku'))
                if v_a_value > -1:
                    pysty_alku.append(i)

            for i in piilot:
                v_l_value = int((i).get_attribute('data-vaakasananloppu'))
                if v_l_value > -1:
                    pysty_loppu.append(i)

            # ACTUALLY WORKS NOW

            while len(
                    driver.find_elements_by_class_name(
                        'painettava.ratkaisematonpsruutu')) >= 2:

                time.sleep(0.3)

                for i in pysty_alku:

                    if human_state == 1 and piste_threshold_reached == True:
                        abort()
                        break
                    elif human_state == 1 and piste_threshold_reached == False:
                        human_behaviour()
                        if piste_threshold_reached == True:
                            abort()
                            break

                    driver.execute_script("arguments[0].click();", i)
                    time.sleep(0.1)

                for i in pysty_loppu:

                    driver.execute_script("arguments[0].click();", i)
                    time.sleep(0.1)

                time.sleep(0.3)

                for i in vaaka_alku:

                    if human_state == 1 and piste_threshold_reached == True:
                        abort()
                        break
                    elif human_state == 1 and piste_threshold_reached == False:
                        human_behaviour()
                        if piste_threshold_reached == True:
                            abort()
                            break

                    driver.execute_script("arguments[0].click();", i)
                    time.sleep(0.2)

                    for i in vaaka_loppu:
                        driver.execute_script("arguments[0].click();", i)
                        time.sleep(0.2)

            time.sleep(1)

            time.sleep(12)
            driver.execute_script("window.scrollTo(0, 1080);")
            time.sleep(0.5)

            end_of_exercise()

            time.sleep(0.5)
            print("Exercise done!")
            write("Exercise done!")

        # MONIVALINTA
        def monivalinta(driver):

            time.sleep(0.2)
            monit = driver.find_elements_by_xpath(
                "//*[@data-playsoundoncorrect]")

            for i in range(len(monit)):
                if human_state == 1 and piste_threshold_reached == True:
                    abort()
                    break
                elif human_state == 1 and piste_threshold_reached == False:
                    human_behaviour()
                    if piste_threshold_reached == True:
                        abort()
                        break
                moni_oikea_vastaus = (monit[i]).get_attribute('data-oikeaarvo')
                (monit[i]).click()
                time.sleep(0.1)
                for x in driver.find_elements_by_xpath(
                        "//*[@class='oamonivalintavaihtoehto' or @class='yhtmonivalintavaihtoehto']"
                ):
                    if str(x.text).lower().strip() == str(
                            moni_oikea_vastaus).lower().strip():
                        x.click()
                        print(moni_oikea_vastaus)

            time.sleep(10)
            driver.execute_script("window.scrollTo(0, 1080);")
            time.sleep(0.5)
            end_of_exercise()
            print("Exercise done!")
            write("Exercise done!")

        # YHDISTELY

        def yhdistely():

            time.sleep(0.2)
            driver.execute_script("window.scrollTo(0, 490);")
            time.sleep(0.2)

            yhdit = driver.find_elements_by_class_name(
                "yhdistettava.yhdistettava_kohde.tekstiyhdistely_kohde")

            for i in range(len(yhdit)):

                if human_state == 1 and piste_threshold_reached == True:
                    abort()
                    break
                elif human_state == 1 and piste_threshold_reached == False:
                    human_behaviour()
                    if piste_threshold_reached == True:
                        abort()
                        break

                yhdistely_oikea_vastaus = (
                    yhdit[i]).get_attribute('data-oikeaarvo')
                (yhdit[i]).click()
                time.sleep(0.2)
                yhdisteet = driver.find_elements_by_class_name(
                    'sekoitettava.harjoituskohta.toggleoncorrect.yhdistettava.yhdistettava_lahde.tekstiyhdistely_lahde'
                )
                for i in range(len(yhdisteet)):
                    if str(
                        (yhdisteet[i]).text) == str(yhdistely_oikea_vastaus):
                        print(yhdistely_oikea_vastaus)
                        write(yhdistely_oikea_vastaus)
                        time.sleep(0.2)
                        (yhdisteet[i]).click()

                    time.sleep(0.2)

            time.sleep(12)
            driver.execute_script("window.scrollTo(0, 1080);")
            time.sleep(0.5)

            end_of_exercise()

            time.sleep(0.5)
            print("Exercise done!")
            write("Exercise done!")

        # AUKKO

        def aukko():

            aukko = driver.find_elements_by_class_name(
                "harjoituskohta.kirjoitettava.painettava")

            for i in range(len(aukko)):

                if human_state == 1 and piste_threshold_reached == True:
                    abort()
                    break
                elif human_state == 1 and piste_threshold_reached == False:
                    human_behaviour()
                    if piste_threshold_reached == True:
                        abort()
                        break

                aukko_oikea_vastaus = (
                    aukko[i]).get_attribute("data-oikeatvastaukset").split(
                        '"text":"', 1)[1].split('"', 1)[0].strip("/")
                print(aukko_oikea_vastaus)
                write(aukko_oikea_vastaus)
                (aukko[i]).send_keys(aukko_oikea_vastaus)
                (aukko[i]).send_keys(Keys.ENTER)

            time.sleep(10)
            driver.execute_script("window.scrollTo(0, 1080);")
            time.sleep(0.5)

            end_of_exercise()

            time.sleep(0.5)
            print("Exercise done!")
            write("Exercise done!")

        # TEORIA

        def teoria():

            time.sleep(0.5)
            driver.execute_script("window.history.go(-1)")
            time.sleep(1)
            print("Exercise done!")
            write("Exercise done!")

        # KUULLUN YMMÄRTÄMINEN

        def kuullun_ymmärtäminen():

            print("lul")
            print("still under development :trol:")
            time.sleep(0.5)
            driver.execute_script("window.history.go(-1)")

        # SANASTO MENU

        all_the_elems = ('//*[@id="divValikkoItemit"]/div[1]',
                         '//*[@id="divValikkoItemit"]/div[2]',
                         '//*[@id="divValikkoItemit"]/div[3]',
                         '//*[@id="divValikkoItemit"]/div[4]',
                         '//*[@id="divValikkoItemit"]/div[5]',
                         '//*[@id="divValikkoItemit"]/div[6]',
                         '//*[@id="divValikkoItemit"]/div[7]',
                         '//*[@id="divValikkoItemit"]/div[8]',
                         '//*[@id="divValikkoItemit"]/div[9]',
                         '//*[@id="divValikkoItemit"]/div[10]',
                         '//*[@id="divValikkoItemit"]/div[11]',
                         '//*[@id="divValikkoItemit"]/div[12]',
                         '//*[@id="divValikkoItemit"]/div[13]',
                         '//*[@id="divValikkoItemit"]/div[14]',
                         '//*[@id="divValikkoItemit"]/div[15]',
                         '//*[@id="divValikkoItemit"]/div[16]',
                         '//*[@id="divValikkoItemit"]/div[17]')

        # FINAL FINISHED FUNCTION

        def omg():
            for i in range(
                    len(
                        driver.find_elements_by_class_name(
                            "selausvalikko.vaihdaosoite"))):
                driver.find_element_by_xpath(all_the_elems[i]).click()
                time.sleep(0.3)
                sub_menu()
                print("Section completed!")
                write("Section completed")
                time.sleep(0.5)
                driver.find_element_by_class_name(
                    "vaihdaosoite.ohjelmapaluupainike").click()

        # SUB MENU

        def sub_menu():
            for i in range(
                    len(
                        driver.find_elements_by_class_name(
                            "selausvalikko.vaihdaosoite"))):
                driver.find_element_by_xpath(all_the_elems[i]).click()
                time.sleep(0.3)
                sub_sub_menu()
                time.sleep(0.3)
                driver.find_element_by_class_name(
                    "vaihdaosoite.ohjelmapaluupainike").click()

        # SUB SUB MENU

        def sub_sub_menu():
            for i in range(
                    len(
                        driver.find_elements_by_class_name(
                            "selausvalikko.vaihdaosoite"))):
                (driver.find_elements_by_class_name(
                    "selausvalikko.vaihdaosoite")[i]).click()
                time.sleep(0.3)

                exercises()

                time.sleep(0.3)
                driver.find_element_by_class_name(
                    "vaihdaosoite.ohjelmapaluupainike").click()

        # EXERCISES

        def exercises():

            for i in range(
                    len(
                        driver.find_elements_by_class_name(
                            'selausaihio_aladivi'))):

                exercise = (
                    driver.find_elements_by_class_name('selausaihio_aladivi')
                    [i]).get_attribute('innerText').partition('\n')[0][4:]
                print(exercise)
                write(exercise)

                exercise_score = (
                    driver.find_elements_by_class_name('selausaihio_aladivi')
                    [i]).get_attribute('innerText').partition('\n')[2].strip()

                if exercise_score == '':
                    exercise_score = "0"
                    print(exercise_score)
                    write(exercise_score)
                else:
                    print(exercise_score)
                    write(exercise_score)

                skip_check = skip_var.get()
                skip_threshold = skip_scale_var.get()

                if skip_check == 1 and int(exercise_score) > skip_threshold:
                    print(exercise + " " + "already completed")
                    write(exercise + " " + "already completed")
                else:
                    (driver.find_elements_by_class_name('selausaihio_aladivi')
                     [i]).click()
                    time.sleep(0.5)
                    if exercise == "Tutustuminen":
                        tutustuminen()
                    elif exercise == "Aukkolause":
                        aukkolause()
                    elif exercise == "Aukkosana":
                        aukkosana()
                    elif exercise == "Kuvavalinta":
                        kuvavalinta()
                    elif exercise == "Monivalinta":
                        monivalinta()
                    elif exercise == "Ristikko":
                        ristikko()
                    elif exercise == "Piilosana":
                        piilosana()
                    elif exercise == "Sanasanelu":
                        sanasanelu()
                    elif exercise == "Yhdistely":
                        yhdistely()
                    elif exercise == "Aukko":
                        aukko()
                    elif exercise == "Teoria":
                        teoria()
                    else:
                        kurssi_exercises()

        # FINAL FUNCTION FOR KURSSITEHTÄVÄT

        def kurssi_omg():

            # TOP LEVEL (MENU)

            kurssi_list = [
                "//*[@id='divKurssinTehtavat']/table/tbody/tr[2]/td[1]/div",
                "//*[@id='divKurssinTehtavat']/table/tbody/tr[3]/td[1]/div",
                "//*[@id='divKurssinTehtavat']/table/tbody/tr[4]/td[1]/div",
                "//*[@id='divKurssinTehtavat']/table/tbody/tr[5]/td[1]/div",
                "//*[@id='divKurssinTehtavat']/table/tbody/tr[6]/td[1]/div",
                "//*[@id='divKurssinTehtavat']/table/tbody/tr[7]/td[1]/div",
                "//*[@id='divKurssinTehtavat']/table/tbody/tr[8]/td[1]/div",
                "//*[@id='divKurssinTehtavat']/table/tbody/tr[9]/td[1]/div",
                "//*[@id='divKurssinTehtavat']/table/tbody/tr[10]/td[1]/div",
                "//*[@id='divKurssinTehtavat']/table/tbody/tr[11]/td[1]/div",
                "//*[@id='divKurssinTehtavat']/table/tbody/tr[12]/td[1]/div"
            ]

            kurssi_table = driver.find_element_by_xpath(
                '//*[@id="divKurssinTehtavat"]/table')
            kurssit = kurssi_table.find_elements_by_class_name(
                "avaakurssitehtava.ikonipainike")
            for i in range(len(kurssit)):
                kurssi_nimi = driver.find_element_by_xpath(
                    (kurssi_list[i])).text
                print(kurssi_nimi)
                write(kurssi_nimi)
                kurssi_harjoitus = driver.find_element_by_xpath(
                    (kurssi_list[i]))
                kurssi_harjoitus.click()
                time.sleep(0.3)
                kurssi_menu()
                time.sleep(0.3)
                siirry_kurssiin = driver.find_element_by_xpath(
                    '//*[@id="divYPlisatoiminnot"]/div')
                siirry_kurssiin.click()
                print("Section compledted!")
                write("Section compledted!")
                time.sleep(0.5)

    # KURSSI MENU

        def kurssi_menu():

            otsikko_list = [
                "//*[@id='divTehtavakohdat']/div/table/tbody/tr[2]/td[2]/div",
                "//*[@id='divTehtavakohdat']/div/table/tbody/tr[3]/td[2]/div",
                "//*[@id='divTehtavakohdat']/div/table/tbody/tr[4]/td[2]/div",
                "//*[@id='divTehtavakohdat']/div/table/tbody/tr[5]/td[2]/div",
                "//*[@id='divTehtavakohdat']/div/table/tbody/tr[6]/td[2]/div",
                "//*[@id='divTehtavakohdat']/div/table/tbody/tr[7]/td[2]/div",
                "//*[@id='divTehtavakohdat']/div/table/tbody/tr[8]/td[2]/div"
            ]

            piste_list = [
                "//*[@id='divTehtavakohdat']/div/table/tbody/tr[2]/td[3]",
                "//*[@id='divTehtavakohdat']/div/table/tbody/tr[3]/td[3]",
                "//*[@id='divTehtavakohdat']/div/table/tbody/tr[4]/td[3]",
                "//*[@id='divTehtavakohdat']/div/table/tbody/tr[5]/td[3]",
                "//*[@id='divTehtavakohdat']/div/table/tbody/tr[6]/td[3]",
                "//*[@id='divTehtavakohdat']/div/table/tbody/tr[7]/td[3]",
                "//*[@id='divTehtavakohdat']/div/table/tbody/tr[8]/td[3]"
            ]

            exercise_list = [
                "//*[@id='divTehtavakohdat']/div/table/tbody/tr[2]/td[4]/div",
                "//*[@id='divTehtavakohdat']/div/table/tbody/tr[3]/td[4]/div",
                "//*[@id='divTehtavakohdat']/div/table/tbody/tr[4]/td[4]/div",
                "//*[@id='divTehtavakohdat']/div/table/tbody/tr[5]/td[4]/div",
                "//*[@id='divTehtavakohdat']/div/table/tbody/tr[6]/td[4]/div",
                "//*[@id='divTehtavakohdat']/div/table/tbody/tr[7]/td[4]/div",
                "//*[@id='divTehtavakohdat']/div/table/tbody/tr[8]/td[4]/div"
            ]

            time.sleep(0.2)
            table = driver.find_element_by_xpath(
                '//*[@id="divTehtavakohdat"]/div/table')
            otsikot = table.find_elements(By.CLASS_NAME,
                                          "kurssitehtavakohtaotsikko")

            for i in range(len(otsikot)):

                global kurssi_otsikko
                kurssi_otsikko = driver.find_element_by_xpath(
                    (otsikko_list[i])).text
                print(kurssi_otsikko)
                write(kurssi_otsikko)

                global kurssi_pisteet
                kurssi_pisteet = driver.find_element_by_xpath(
                    (piste_list[i])).text
                print(kurssi_pisteet)
                write(kurssi_pisteet)

                time.sleep(0.2)
                kurssi_harjoitus = driver.find_element_by_xpath(
                    (exercise_list[i]))

                if str(kurssi_pisteet) == 'Avattu':
                    kurssi_pisteet = "0"

                elif str(kurssi_pisteet) == '-':
                    kurssi_pisteet = "0"

                skip_check = skip_var.get()
                skip_threshold = skip_scale_var.get()

                if skip_check == 1 and int(kurssi_pisteet) > skip_threshold:
                    print(kurssi_otsikko + " " + "already completed")
                    write(kurssi_otsikko + " " + "already completed")

                else:
                    kurssi_harjoitus.click()
                    time.sleep(0.2)
                    kurssi_exercises()

        # KURSSI EXERCISES

        def kurssi_exercises():

            exercise_dict = {
                'tutustuminen': tutustuminen,
                'aukkolause': aukkolause,
                'aukkosana': aukkosana,
                'kuvavalinta': kuvavalinta,
                'monivalinta': monivalinta,
                'ristikko': ristikko,
                'piilosana': piilosana,
                'yhdistely': yhdistely,
                'aukko': aukko,
                'teoria': teoria,
                'kuullunymmärtäminen': kuullun_ymmärtäminen
            }

            time.sleep(0.5)
            aihiokoodi = driver.find_element_by_xpath(
                '//*[@id="divYPnimilaatikko"]/span[1]')
            aihiokoodi.click()
            time.sleep(0.8)
            aihiokoodi_table = driver.find_element_by_xpath(
                '//*[@id="divAihioPopup"]/div/table[2]')
            aihiokoodi_row = aihiokoodi_table.find_elements(By.TAG_NAME,
                                                            "tr")[1]
            exercise = str(
                aihiokoodi_row.find_elements(By.TAG_NAME, "td")[1].text.split(
                    "(", 1)[1].strip(")").strip().lower())
            print(exercise)
            write(exercise)
            sulje_aihiokoodi = driver.find_element_by_id('divSuljeAihioKortti')
            time.sleep(0.2)
            sulje_aihiokoodi.click()
            time.sleep(0.5)

            exercise_dict[exercise]()

        # WHICH FUNCTION SELECT

        if str(url_type_var.get()) == "Kurssitehtävät":
            if custom_sanasto != "":
                kurssi_omg()
            else:
                omg()

        else:
            omg()

        print("Automation ended!")
        write("Automation ended!")
        time.sleep(5)
        driver.quit()

    # COLOR HEX

    navy = '#343647'
    gray = '#CCCCCC'
    baby_blue = '#99ccff'
    light_blue = '#899cf0'
    light_purple = '#c2c4f5'

    # BACKGROUND IMAGE

    background = PhotoImage(file="img\\bg.png")
    bg_label = Label(root, image=background)
    bg_label.place(x=0, y=0, relwidth=1, relheight=1)
    bg_label.image = background

    # STASTUS BAR

    status_bar = Canvas(root, bg=gray, width=1072, height=31, borderwidth=0)
    status_bar.place(x=0, y=0)

    # BUTTONS

    # SETTINGS WINDOW

    def settings_window():
        if settings_root.state() != "normal":
            settings_root.deiconify()
        else:
            settings_root.withdraw()

    settings_root = Toplevel()
    settings_root.title("Settings")
    settings_root.iconbitmap('img\\settings.ico')
    settings_root.geometry('585x645+1150+260')
    settings_root.resizable(False, False)

    # SETTINGS BACKGROUND IMAGE

    settings_background = PhotoImage(file="img\\settings_bg.png")
    settings_bg_label = Label(settings_root, image=settings_background)
    settings_bg_label.place(x=0, y=0, relwidth=1, relheight=1)
    settings_bg_label.image = settings_background

    # ACTUAL SETTINGS #

    # NUMBER SCALES #

    # SKIP SCALE

    skip_scale_var = IntVar()
    skip_scale = Scale(
        settings_root,
        bg=gray,
        resolution=5,
        variable=skip_scale_var,
        from_=0,
        to=100,
        orient="horizontal",
        width=20,
        sliderlength=40,
        length=450,
        label="Change the minimium score for skipping an exercise")

    skip_scale.set(70)
    skip_scale.place(x=70, y=220)
    skip_scale.lower()

    close_skip = Button(settings_root, bg=gray, height=1, width=5, text="ok")

    def hide_skip_scale():
        global popup_open
        popup_open = 0
        write("Skip threshold set to " + str(skip_scale_var.get()) + " points")
        human_check.config(state='normal')
        url_check.config(state='normal')
        skip_scale.lower()
        close_skip.lower()

    close_skip['command'] = hide_skip_scale
    close_skip.place(x=255, y=320)
    close_skip.lower()

    # HUMAN SCALE

    human_scale_var = IntVar()
    human_scale = Scale(
        settings_root,
        bg=gray,
        resolution=5,
        variable=human_scale_var,
        from_=0,
        to=100,
        orient="horizontal",
        width=20,
        sliderlength=40,
        length=450,
        label="Change the minimium score to finish an exercise")

    human_scale.set(90)
    human_scale.place(x=70, y=220)
    human_scale.lower()

    close_human = Button(settings_root, bg=gray, height=1, width=5, text="ok")

    def hide_human_scale():
        global popup_open
        popup_open = 0
        write("Human threshold set to " + str(human_scale_var.get()) +
              " points")
        skip_check.config(state='normal')
        url_check.config(state='normal')
        human_scale.lower()
        close_human.lower()

    close_human['command'] = hide_human_scale
    close_human.place(x=255, y=320)
    close_human.lower()

    # CUSTOM URL ENTRY

    url_label = Label(settings_root,
                      bg=gray,
                      fg="black",
                      width=45,
                      height=3,
                      text="Enter your own URL for opinaika",
                      anchor="n")
    url_label.place(x=70, y=220)
    url_label.lower()

    url_entry_var = StringVar(value="")
    url_entry = Entry(settings_root,
                      bg=navy,
                      fg="white",
                      width=45,
                      textvariable=url_entry_var)
    url_entry.place(x=71, y=274)
    url_entry.lower()

    url_OPTIONS = [
        "Kurssitehtävät",
        "Sanasto+",
    ]

    url_type_var = StringVar(root)
    url_type_var.set(url_OPTIONS[0])

    url_type_menu = OptionMenu(settings_root, url_type_var, *url_OPTIONS)
    url_type_menu.place(x=70, y=175)
    url_type_menu.config(bg=gray)
    url_type_menu["menu"].config(bg=gray)
    url_type_menu.lower()
    Hovertip(url_type_menu, "Select the exercise type")

    close_url = Button(settings_root, bg=gray, height=1, width=5, text="ok")

    def hide_url_entry():
        global popup_open
        popup_open = 0
        write('Opinaika url set to "' + str(url_entry_var.get()) + '"')
        skip_check.config(state='normal')
        human_check.config(state='normal')
        url_entry.lower()
        close_url.lower()
        url_label.lower()
        url_type_menu.lower()

    close_url['command'] = hide_url_entry
    close_url.place(x=255, y=320)
    close_url.lower()

    # SKIP CHECKBOX

    popup_open = 0

    skip_var = IntVar(value=1)

    def show_skip_scale():
        global popup_open
        if skip_var.get() == 1:
            popup_open = 1
            if popup_open == 1:
                human_check.config(state='disabled')
                url_check.config(state='disabled')
                skip_scale.lift()
                close_skip.lift()
            else:
                human_check.config(state='normal')
                url_check.config(state='normal')
            skip_scale.lift()
            close_skip.lift()
        else:
            popup_open = 0
            if popup_open == 1:
                human_check.config(state='disabled')
                url_check.config(state='disabled')
                skip_scale.lift()
                close_skip.lift()
            else:
                human_check.config(state='normal')
                url_check.config(state='normal')
            skip_scale.lower()
            close_skip.lower()

    skip_check = Checkbutton(settings_root,
                             bg=gray,
                             height=1,
                             text="Skip completed exercises",
                             variable=skip_var,
                             command=show_skip_scale)
    skip_check.place(x=10, y=15)
    Hovertip(skip_check, "Skip the exercise if the score is 70p or higher")

    # HUMANLIKE BEHAVIOUR CHECKBOX

    human_var = IntVar(value=0)

    def show_human_scale():
        global popup_open
        if human_var.get() == 1:
            popup_open = 1
            if popup_open == 1:
                url_check.config(state='disabled')
                skip_check.config(state='disabled')
            else:
                url_check.config(state='normal')
                skip_check.config(state='normal')
            human_scale.lift()
            close_human.lift()
        else:
            popup_open = 0
            if popup_open == 1:
                url_check.config(state='disabled')
                skip_check.config(state='disabled')
            else:
                url_check.config(state='normal')
                skip_check.config(state='normal')
            human_scale.lower()
            close_human.lower()

    human_check = Checkbutton(settings_root,
                              bg=gray,
                              height=1,
                              text="Humanlike behaviour",
                              variable=human_var,
                              command=show_human_scale)
    human_check.place(x=10, y=60)
    Hovertip(human_check, "Exit the exercise when 90p reached")

    # CUSTOM URL GIVEN BY USER

    url_check_var = IntVar(value=0)

    def show_url_entry():
        global popup_open
        if url_check_var.get() == 1:
            popup_open = 1
            if popup_open == 1:
                human_check.config(state='disabled')
                skip_check.config(state='disabled')
            else:
                human_check.config(state='normal')
                skip_check.config(state='normal')
            url_label.lift()
            url_entry.lift()
            close_url.lift()
            url_type_menu.lift()
        else:
            popup_open = 0
            if popup_open == 1:
                human_check.config(state='disabled')
                skip_check.config(state='disabled')
            else:
                human_check.config(state='normal')
                skip_check.config(state='normal')
            url_label.lower()
            url_entry.lower()
            close_url.lower()
            url_type_menu.lower()

    url_check = Checkbutton(settings_root,
                            bg=gray,
                            height=1,
                            text="Custom URL",
                            variable=url_check_var,
                            command=show_url_entry)
    url_check.place(x=10, y=105)
    Hovertip(url_check, "Use custom opinaika URL given by user")

    # SAVE SETTINGS BUTTON

    def save_settings():

        if str(skip_check['state']) != 'disabled':
            write("Settings saved")

        settings_root.withdraw()

    save = Button(settings_root,
                  bg=gray,
                  width=6,
                  height=1,
                  text="save",
                  command=save_settings)
    save.place(x=10, y=590)

    settings_root.withdraw()

    def on_closing():
        settings_root.withdraw()

    settings_root.protocol("WM_DELETE_WINDOW", on_closing)

    # SETTINGS BUTTON

    settings_img = PhotoImage(file="img\\set.png")
    settings_button = Button(root,
                             image=settings_img,
                             command=settings_window,
                             borderwidth=0,
                             bg=gray)
    settings_button.image = settings_img
    settings_button.place(x=1030, y=2)

    # ENTRIES

    username_text = StringVar(root)
    password_text = StringVar(root)

    username = Entry(root,
                     bg=navy,
                     fg="white",
                     textvariable=username_text,
                     width=23)
    username.place(x=30, y=95, relwidth=0.36, relheight=0.045)

    password = Entry(root,
                     bg=navy,
                     fg="white",
                     textvariable=password_text,
                     show="*",
                     width=23)
    password.place(x=30, y=140, relwidth=0.36, relheight=0.045)

    # NOW PLAYING TEXT

    now_playing = Label(status_bar, bg=gray, text=" ", width=75)
    now_playing.place(x=150, y=2)

    # MUSIC

    def menu_music():

        mixer.init()
        lists_of_songs = os.listdir("img/music")

        for song in lists_of_songs:
            if song.endswith(".mp3"):
                file_path = "img/music/" + song
                mixer.music.load(str(file_path))
                mixer.music.play()
                print("Playing::::: " + song[:-4])
                now_playing.config(text="Now playing ::: " + " " +
                                   str(song[:-4]))

                while mixer.music.get_busy() == True:
                    continue

    music_thread = threading.Thread(target=menu_music)
    music_thread.daemon = True
    music_thread.start()

    # TERMINAL THING

    terminal = Text(root, bg=navy, fg="white", height=9, width=38)
    terminal.place(x=0, y=575)
    terminal.tag_config("green", background=navy, foreground="green")
    terminal.tag_config("baby_blue", background=navy, foreground=baby_blue)
    terminal.tag_config("light_blue", background=navy, foreground=light_blue)
    terminal.tag_config("light_purple",
                        background=navy,
                        foreground=light_purple)

    terminal.insert(
        END,
        "Dirty my life, I clean for you\nI dream of life, it might come true\nI need a break, can I live?\nI need to change something quick\nI pay the price for the sin\nI'm at the gate, let me in\nI take my life for the risk\nI roll a dice, need a six\n",
        'baby_blue')
    terminal.config(state='disabled')

    # TEXT INTO TERMINAL

    def write(*message, end="\n", sep=" "):
        terminal.config(state='normal')
        text = ""
        for i in message:
            text += "{}".format(i)
            text += sep
        text += end
        terminal.insert(INSERT, text, "light_purple")
        terminal.see(END)
        terminal.config(state='disabled')

    def lock():
        username.config(state='disabled')
        password.config(state='disabled')
        dropdown_menu.config(state='disabled')
        login.config(state='disabled')
        skip_check.config(state='disabled')
        terminal.config(state='disabled')
        human_check.config(state='disabled')
        url_check.config(state='disabled')

    def lock_and_run_chrome():

        if str(username.get()) == "":
            print("Invalid email/pass")
            write("Invalid email/pass")

        elif str(password.get()) == "":
            print("Invalid email/pass")
            write("Invalid email/pass")

        else:
            write("\n")
            lock()
            chrome_thread = threading.Thread(target=chrome_script)
            chrome_thread.daemon = True
            chrome_thread.start()

    # LOGIN BUTTON

    login = Button(root,
                   bg=gray,
                   width=6,
                   text="login",
                   command=lock_and_run_chrome)
    login.place(x=175, y=200)

    # DROPDOWN MENU FOR ENGLISH/SWEDISH MODE

    lang_OPTIONS = [
        "Swedish", "English", "German", "Spanish", "Russian", "French",
        "Italian"
    ]

    lang_variable = StringVar(root)
    lang_variable.set(lang_OPTIONS[0])

    dropdown_menu = OptionMenu(root, lang_variable, *lang_OPTIONS)
    dropdown_menu.place(x=0, y=0)
    dropdown_menu.config(bg=gray)
    dropdown_menu["menu"].config(bg=gray)

    # INFO POPUP

    lines = [
        'Please read the instructions in readme.nfo', ' ', ' ', ' ', ' ', ' ',
        ' ', 'Made by Arrow', ' ', '©2021 A Dream of Life All rights reserved'
    ]

    messagebox.showinfo(' Bliss Fields', "\n".join(lines))