Beispiel #1
0
def handle_text_message(event):
    text = event.message.text
    textlow = event.message.text.lower()
    """ GET DATA FROM DATABASE """
    # Config
    db = Database(Config)
    # Query
    # This query will return array data
    userid_db_all = db.run_query(Select.userid_db_all(), user_name, user_id)
    userid_db = db.run_query(Select.userid_db(user_id), user_name, user_id)
    usertoken_db = db.run_query(Select.usertoken_db(user_id), user_name,
                                user_id)
    useremail_db = db.run_query(Select.useremail_db(user_id), user_name,
                                user_id)
    userstatusemail_db = db.run_query(Select.userstatusemail_db(user_id),
                                      user_name, user_id)
    userpasswd_db = db.run_query(Select.userpasswd_db(user_id), user_name,
                                 user_id)
    usernick_db = db.run_query(Select.usernick_db(user_id), user_name, user_id)
    userplace_db = db.run_query(Select.userplace_db(user_id), user_name,
                                user_id)
    userprivilege_db = db.run_query(Select.userprivilege_db(user_id),
                                    user_name, user_id)
    userready_db = db.run_query(Select.userready_db(user_id), user_name,
                                user_id)
    userbiro_db = db.run_query(Select.userbiro_db(user_id), user_name, user_id)
    user_statusjawab_db = db.run_query(Select.user_statusjawab_db(user_id),
                                       user_name, user_id)
    userpush_db = db.run_query(Select.userpush_db(user_id), user_name, user_id)
    """ TRAFFIC MONITOR """
    # Store data Usertext to database
    db.run_query(Insert.usertext(user_id, user_name, text, "yes"), user_name,
                 user_id)
    # Store Count Userpush to database
    try:
        db.run_query(Update.userpush(str(userpush_db[0] + 1), user_id),
                     user_name, user_id)
    except:
        pass
    """ USER ADD CONTROL """
    if userid_db == []:
        if textlow == 'add':
            db.run_query(Insert.userjoin(user_id, user_name, user_picture),
                         user_name, user_id)
        elif textlow == 'lanjutkan':
            db.run_query(Insert.userjoin(user_id, user_name, user_picture),
                         user_name, user_id)
            Answer.menu(event)
        else:
            bubble = BubbleContainer(
                direction='ltr',
                hero=BoxComponent(),
                body=BoxComponent(
                    layout='vertical',
                    contents=[
                        # Title
                        TextComponent(text="Selamat datang di Vanika",
                                      weight='bold',
                                      size='md',
                                      gravity='center',
                                      wrap=True),
                        # Info
                        TextComponent(
                            text='Hello, ' + user_name +
                            '\nSelamat datang di Vanika, tekan "Lanjutkan" untuk ngobrol dengan Vanika',
                            color="#aaaaaa",
                            size='xs',
                            gravity='center',
                            wrap=True),
                        SeparatorComponent(),
                    ],
                ),
                footer=BoxComponent(layout='horizontal',
                                    spacing='sm',
                                    contents=[
                                        ButtonComponent(
                                            style='primary',
                                            color='#11BBFF',
                                            height='sm',
                                            action=MessageAction(
                                                label='Lanjutkan',
                                                text='lanjutkan'),
                                        ),
                                    ]),
            )
            message = FlexSendMessage(alt_text="Confirm", contents=bubble)
            line_bot_api.reply_message(event.reply_token, [message])
    elif userready_db[0] == 'yes':
        if user_statusjawab_db[0] == 'none':
            if textlow == "menu":
                Answer.menu(event)
            elif ('!menumahasiswa' in text) or ('menu mahasiswa' in textlow):
                if useremail_db[0] == "none":
                    Answer.menu_login(event, user_name)
                else:
                    if userstatusemail_db[0] == "notverified":
                        db.run_query(
                            Update.userstatusemail("verified", user_id),
                            user_name, user_id)
                        Email.kirimEmail(useremail_db[0], user_name, user_id)
                        Answer.menu_mahasiswa(event, user_name)
                    else:
                        Answer.menu_mahasiswa(event, user_name)

            ############################################################
            # MENU MAHASISWA
            ############################################################
            elif ('!profile' in text) or ('profile' in textlow):
                if userstatusemail_db[0] == "verified":
                    raw_nim = useremail_db[0].replace("@student.unika.ac.id",
                                                      "")
                    nim_tahun = raw_nim[0:2]
                    nim_jurusan = raw_nim[2:4]
                    nim_noutur = raw_nim[4:8]
                    nim = nim_tahun + nim_jurusan + nim_noutur
                    ENDPOINT = "http://sintak.unika.ac.id/id/filektm/" + nim.upper(
                    ) + ".jpg"
                    my_path = "/var/www/html/vanikabot/ktmweb"
                    urllib.request.urlretrieve(
                        ENDPOINT,
                        os.path.join(my_path,
                                     os.path.basename(nim.upper() + ".jpg")))
                    data = {
                        "type": "bubble",
                        "body": {
                            "type":
                            "box",
                            "layout":
                            "vertical",
                            "contents": [{
                                "type":
                                "image",
                                "url":
                                "https://vanika.tru.io/vanikabot/ktmweb/" +
                                nim.upper() + ".jpg",
                                "size":
                                "full",
                                "aspectMode":
                                "cover",
                                "aspectRatio":
                                "20:13",
                                "gravity":
                                "center"
                            }],
                            "paddingAll":
                            "0px"
                        }
                    }
                    template_message = FlexSendMessage(alt_text='KTM',
                                                       contents=data)
                    line_bot_api.reply_message(event.reply_token,
                                               [template_message])
                else:
                    Answer.jawaban_login(event, user_name)

            elif ("ipk" in textlow) or ("ips" in textlow):
                if userstatusemail_db[0] == "verified":
                    raw_nim = useremail_db[0].replace("@student.unika.ac.id",
                                                      "")
                    nim_tahun = raw_nim[0:2]
                    nim_jurusan = raw_nim[2:4]
                    nim_noutur = raw_nim[4:8]
                    nim = nim_tahun + "." + nim_jurusan + "." + nim_noutur
                    Sintak.ipk_ips(event, user_name, nim)
                else:
                    Answer.jawaban_login(event, user_name)

            elif ("transkrip" in textlow):
                if userstatusemail_db[0] == "verified":
                    raw_nim = useremail_db[0].replace("@student.unika.ac.id",
                                                      "")
                    nim_tahun = raw_nim[0:2]
                    nim_jurusan = raw_nim[2:4]
                    nim_noutur = raw_nim[4:8]
                    nim = nim_tahun + "." + nim_jurusan + "." + nim_noutur
                    Sintak.transkrip(event, user_name, nim)
                else:
                    Answer.jawaban_login(event, user_name)

            elif ("tagihan" in textlow):
                if userstatusemail_db[0] == "verified":
                    text_split = text.split(" ")
                    if len(text_split) == 3:
                        raw_nim = useremail_db[0].replace(
                            "@student.unika.ac.id", "")
                        nim_tahun = raw_nim[0:2]
                        nim_jurusan = raw_nim[2:4]
                        nim_noutur = raw_nim[4:8]
                        nim = nim_tahun + "." + nim_jurusan + "." + nim_noutur
                        tahun = text_split[1]
                        period = text_split[2]
                        Sintak.tagihan(event, user_name, nim, tahun, period)
                    else:
                        raw_nim = useremail_db[0].replace(
                            "@student.unika.ac.id", "")
                        nim_tahun = raw_nim[0:2]
                        Answer.tagihan_input_tahun(event, "20" + nim_tahun)

                else:
                    Answer.jawaban_login(event, user_name)

            elif ("logout" in textlow):
                if userstatusemail_db[0] == "verified":
                    db.run_query(
                        Update.userstatusemail("notverified", user_id),
                        user_name, user_id)
                    db.run_query(Update.user_email("none", user_id), user_name,
                                 user_id)
                    Answer.menu(event)
                else:
                    Answer.jawaban_login(event, user_name)
            ############################################################
            # BIRO
            ############################################################
            elif ('!tanyabiro' in text) or ('tanya biro' in textlow):
                Answer.menu_biro(event)
            elif ('Mahasiswa baru' == text):
                Answer.mahasiswa_baru(event)
            elif ('Akademik' == text):
                Answer.jawaban_biro(event, 'Akademik', user_name)
            elif ('Keuangan' == text):
                Answer.jawaban_biro(event, 'Keuangan', user_name)
            elif ('Pusat karir' == text):
                Answer.jawaban_biro(event, 'Pusat Karir', user_name)
            elif ('Perpustakaan' == text):
                Answer.menu_perpustakaan(event, user_name)
            elif ("cari buku" == textlow):
                Answer.cari_buku(event)
            elif ('Kemahasiswaan' == text):
                Answer.jawaban_biro(event, 'Kemahasiswaan', user_name)
            ############################################################
            # MAHASISWA BARU
            ############################################################
            elif ('!infoprodi' in text) or ('informasi prodi' in textlow) or (
                    'info program studi' in textlow):
                Answer.info_prodi(event)
            elif ('!lokasi' in text) or ("map" in textlow):
                Answer.lokasi(event)
            elif ('!infokos' in text) or ('info kos' in textlow):
                Answer.infokos(event)
            elif ("!jadwalpendaftaran" in text) or ("jadwal pendaftaran"
                                                    in textlow):
                Answer.buku_panduan(event, "Jadwal pendaftaran", "12")
            elif ('!carapendaftaran' in text) or ('cara pendaftaran'
                                                  in textlow):
                Answer.buku_panduan(event, "Prosedur pendaftaran", "8")
            elif ("!biaya" in text) or ("biaya" in textlow):
                Answer.buku_panduan(event, "Biaya pendaftaran", "20")
            elif ("!syarat" in text) or ("syarat pendaftaran" in textlow) or (
                    'syarat kuliah di unika' in textlow):
                Answer.buku_panduan(event, "Syarat pendaftaran", "6")
            elif ('!pembayaran' in text) or ("cara pembayaran" in textlow):
                Answer.pembayaran(event)
            elif ('!pengumuman' in text) or ('pengumuman' in textlow):
                Answer.pengumuman(event)
            elif ('!daftarulang' in text) or ('daftar ulang' in textlow):
                Answer.daftar_ulang(event)
            elif ('!pmb' in text) or ('pembekalan mahasiswa baru' in textlow):
                Answer.pmb(event)
            elif ('!hotline' in text) or ('hotline'
                                          in textlow) or ("nomor" in textlow):
                Answer.hotline(event)
            elif ('!email' in text) or ('email' in textlow):
                Answer.email(event)
            elif ('!admin' in text) or ('admin' in textlow):
                Answer.admin(event)
            ############################################################
            # JURUSAN
            ############################################################
            # it's empty space
            ############################################################
            # CHAT
            ############################################################
            elif ('baik' in textlow) or ('alhamdulillah'
                                         in textlow) or ('sangat baik'
                                                         in textlow):
                line_bot_api.reply_message(
                    event.reply_token,
                    TextSendMessage(
                        text="Puji tuhan \nSemoga harinya lancar kak " +
                        user_name + " ?"))
            ############################################################
            # WEB SCRAPING
            ############################################################
            elif ('!beasiswa' in text) or ('beasiswa' in textlow):
                Beasiswa.beasiswa(event)

            elif ('!lowongan' in text) or ('lowongan' in textlow):
                Lowongan.lowongan(event)

            elif ("!news" in text) or ("news" in textlow) or ('berita'
                                                              in textlow):
                Unikanews.unikanews(event)

            elif ("!io" in text) or (textlow == "international office"):
                Internationaloffice.internationaloffice(event)

            elif ("cari buku" in textlow):
                buku = text[0:].split(" ", 2)
                try:
                    ENDPOINT = "http://lib.unika.ac.id/index.php?keywords=" + buku[
                        2].lower().replace(" ", "+") + "&search=Pencarian"
                    url = urlreq.urlopen(
                        urlreq.Request(
                            ENDPOINT,
                            headers={
                                'User-Agent':
                                "Mozilla/5.0 (compatible; MSIE 5.01; Windows NT 5.0)"
                            }))
                    udict = url.read().decode('utf-8')
                    rawurl = re.findall(
                        '<div class="detail-list"><h4><a href="(.*?)"', udict,
                        re.DOTALL | re.IGNORECASE)
                    rawtitels = re.findall(
                        'citationLink" title="Citation for: (.*?)"', udict,
                        re.DOTALL | re.IGNORECASE)
                    my_path = "/var/www/html/vanikabot/imageperpus"

                    columns = []
                    for i in range(0, 5):
                        url = urlreq.urlopen(
                            urlreq.Request(
                                "http://lib.unika.ac.id/" + rawurl[i],
                                headers={
                                    'User-Agent':
                                    "Mozilla/5.0 (compatible; MSIE 5.01; Windows NT 5.0)"
                                }))
                        udict = url.read().decode('utf-8')
                        rawimg = re.findall(
                            '<img itemprop="image" alt="Image of ' +
                            rawtitels[i] + '" src="(.*?)"', udict,
                            re.DOTALL | re.IGNORECASE)
                        if rawimg == []:
                            rawimg = "https://vanika.tru.io/vanikabot/tandatanya.jpg"
                        else:
                            rawimg = "http://lib.unika.ac.id" + rawimg[0]

                        img = rawimg.replace("&amp;width=200", "&width=500")

                        urllib.request.urlretrieve(
                            img,
                            os.path.join(my_path,
                                         os.path.basename(str(i) + ".png")))

                        carousel_column = BubbleContainer(
                            direction='ltr',
                            styles=BubbleStyle(footer=BlockStyle(
                                background_color="#11BBFF")),
                            header=BoxComponent(layout='vertical',
                                                contents=[
                                                    TextComponent(
                                                        text="HASIL PENCARIAN",
                                                        weight='bold',
                                                        color="#11BBFF",
                                                        size='sm',
                                                        gravity='center',
                                                        wrap=True),
                                                ]),
                            hero=ImageComponent(
                                url=
                                "https://vanika.tru.io/vanikabot/imageperpus/"
                                + str(i) + ".png",
                                size='full',
                                aspect_ratio='20:13',
                                aspect_mode='cover',
                                action=URIAction(
                                    uri=
                                    "https://vanika.tru.io/vanikabot/imageperpus/"
                                    + str(i) + ".png",
                                    label='picture')),
                            body=BoxComponent(
                                layout='vertical',
                                contents=[
                                    #titile
                                    TextComponent(text=rawtitels[i],
                                                  weight='bold',
                                                  size='md',
                                                  gravity='center',
                                                  wrap=True),
                                ],
                            ),
                            footer=BoxComponent(
                                layout='vertical',
                                spacing='sm',
                                contents=[
                                    ButtonComponent(
                                        style='primary',
                                        color="#11BBFF",
                                        height='sm',
                                        action=URIAction(
                                            label='Detail',
                                            uri="http://lib.unika.ac.id" +
                                            rawurl[i])),
                                ]),
                        )
                        columns.append(carousel_column)

                    carousel_template = CarouselContainer(contents=columns)
                    template_message = FlexSendMessage(
                        alt_text='Daftar Buku', contents=carousel_template)
                    line_bot_api.reply_message(event.reply_token, [
                        template_message,
                        TextSendMessage(
                            text="Hasil lebih lengkap bisa kunjungi " +
                            ENDPOINT)
                    ])
                except:
                    line_bot_api.reply_message(event.reply_token, [
                        TextSendMessage(
                            text="Tidak ada hasil pencarian untuk " + text +
                            "\nKunjungi situs perpustakaan di lib.unika.ac.id\n",
                            quick_reply=QuickReply(items=[
                                QuickReplyButton(action=MessageAction(
                                    label="Menu", text="Menu")),
                            ]))
                    ])
            ############################################################
            # AIML
            # GET DATA FROM aiml app and DATABASE COMMAND
            ############################################################
            elif text == text:
                inputan = textlow.replace(" ", "%20")
                #FROM DATABASE
                command_from_db = db.run_query(Select.command_db(text),
                                               user_name, user_id)
                userpush_db_command = db.run_query(
                    Select.userpush_db_command(text), user_name, user_id)
                if command_from_db == []:
                    #FROM AIML
                    try:  #prm
                        aiml_unika = urlopen(
                            "http://app.unika.ac.id/bot/chatbot/conversation_start.php?convo_id="
                            + user_id + "&format=json&bot_id=1&say=" +
                            inputan).read()
                    except:
                        bot_say = 'Semoga ke depannya akan selalu baik adanya...'
                    try:  #baa
                        aiml_unika = urlopen(
                            "http://app.unika.ac.id/bot/chatbot/conversation_start.php?convo_id="
                            + user_id + "&format=json&bot_id=3&say=" +
                            inputan).read()
                    except:
                        bot_say = 'Semoga ke depannya akan selalu baik adanya...'
                    try:  #bak
                        aiml_unika = urlopen(
                            "http://app.unika.ac.id/bot/chatbot/conversation_start.php?convo_id="
                            + user_id + "&format=json&bot_id=4&say=" +
                            inputan).read()
                    except:
                        bot_say = 'Semoga ke depannya akan selalu baik adanya...'
                    try:  #aacc
                        aiml_unika = urlopen(
                            "http://app.unika.ac.id/bot/chatbot/conversation_start.php?convo_id="
                            + user_id + "&format=json&bot_id=6&say=" +
                            inputan).read()
                    except:
                        bot_say = 'Semoga ke depannya akan selalu baik adanya...'
                    try:  #perpus
                        aiml_unika = urlopen(
                            "http://app.unika.ac.id/bot/chatbot/conversation_start.php?convo_id="
                            + user_id + "&format=json&bot_id=7&say=" +
                            inputan).read()
                    except:
                        bot_say = 'Semoga ke depannya akan selalu baik adanya...'
                    try:  #kemahaiswaan
                        aiml_unika = urlopen(
                            "http://app.unika.ac.id/bot/chatbot/conversation_start.php?convo_id="
                            + user_id + "&format=json&bot_id=5&say=" +
                            inputan).read()
                    except:
                        bot_say = 'Semoga ke depannya akan selalu baik adanya...'

                    bot_say = json.loads(aiml_unika)['botsay']
                    if ('Semoga ke depannya akan selalu baik adanya...'
                            in bot_say) or ('No answer' in bot_say):
                        Answer.else_message(event, user_name)
                        db.run_query(
                            Update.usertext_update(user_id, text, "no"),
                            user_name, user_id)
                    else:
                        line_bot_api.reply_message(
                            event.reply_token, TextSendMessage(text=bot_say))
                else:
                    bot_say = command_from_db[0]
                    db.run_query(
                        Update.userpush_command(
                            str(userpush_db_command[0] + 1), text), user_name,
                        user_id)
                    line_bot_api.reply_message(event.reply_token,
                                               TextSendMessage(text=bot_say))
            else:
                Answer.else_message(event, user_name)
                db.run_query(Update.usertext_update(user_id, text, "no"),
                             user_name, user_id)