Skip to content

Instantly share code, notes, and snippets.

@WisnuDS
Last active June 22, 2020 14:52
Show Gist options
  • Save WisnuDS/b87aee2e3bc71d7295cba7d34f8cf7fd to your computer and use it in GitHub Desktop.
Save WisnuDS/b87aee2e3bc71d7295cba7d34f8cf7fd to your computer and use it in GitHub Desktop.
Bot for Smart Lurah Application
import os
import logging
from datetime import datetime
from telegram.ext import Updater, CommandHandler, MessageHandler, Filters
import time
import requests
import json
import re
BASE_URL = "http://127.0.0.1:8000/api/"
logging.basicConfig(format='%(asctime)s - %(name)s - %(levelname)s - %(message)s',
level=logging.INFO)
logger = logging.getLogger(__name__)
def error_callback(update, context):
logger.warning('Update "%s" caused error "%s"', update, context.error)
user_activity = {}
status_syarat = {}
def brain(update, context):
chat_id = update.message.chat_id
activity = user_activity[chat_id].get('activity')
if activity == 'registration':
data = user_activity[chat_id].get("data")
if data.get('name') is None:
if update.message.text is not None:
user_activity[chat_id]['data']['name'] = update.message.text
context.bot.send_message(chat_id=chat_id, text="Silahkan kirim foto ktp anda")
else:
context.bot.send_message(chat_id=chat_id,
text="Anda salah mengirimkan data, seharusnya data yang anda kirim adalah nama anda")
elif data.get('url_ktp_photo') is None:
if update.message.photo is not None:
path = "/" + str(chat_id) + "/registration"
try:
os.makedirs(os.getcwd() + path)
except FileExistsError:
pass
file_id = update.message.photo[-1].file_id
new_file = context.bot.get_file(file_id)
fix_path = os.getcwd() + path + "/" + "ktp" + '_' + str(time.time()).replace('.', '_') + '.jpg'
user_activity[chat_id]['data']['url_ktp_photo'] = fix_path
new_file.download(fix_path)
context.bot.send_message(chat_id=chat_id,
text="Silahkan Kirim foto diri anda dengan memegang ktp (wajah harus nampak jelas)")
else:
context.bot.send_message(chat_id=chat_id,
text="Anda salah mengirimkan data, seharusnya data yang anda kirim adalah foto ktp anda")
elif data.get('url_self_photo') is None:
if update.message.photo is not None:
path = "/" + str(chat_id) + "/registration"
file_id = update.message.photo[-1].file_id
new_file = context.bot.get_file(file_id)
fix_path = os.getcwd() + path + "/" + "self" + '_' + str(time.time()).replace('.', '_') + '.jpg'
user_activity[chat_id]['data']['url_self_photo'] = fix_path
new_file.download(fix_path)
data = user_activity[chat_id].get('data')
print(data)
response = requests.post(BASE_URL + "users/", json=data)
print(response.json())
context.bot.send_message(chat_id=chat_id,
text="Data Anda telah direcord, selanjutnya data anda akan diverifikasi oleh petugas")
user_activity[chat_id].clear()
else:
context.bot.send_message(chat_id=chat_id,
text="Anda salah mengirimkan data, seharusnya data yang anda kirim adalah foto diri anda")
elif activity == 'syarat':
if str(update.message.text).isdigit():
response = requests.get(BASE_URL + 'services/' + str(update.message.text) + '/')
json_response = response.json()
text = 'Persyaratan yang dibutuhkan untuk mengurus ' + json_response['type_service'] + "\n"
i = 1
for data in json_response['detail']:
id, name = str(data).split('.')
text1 = '{}. {}\n'.format(i, name)
text += text1
i += 1
context.bot.send_message(chat_id=chat_id, text=text)
user_activity[chat_id].clear()
else:
context.bot.send_message(chat_id=chat_id, text="Format Inputan yang anda masukan salah, masukan ulang")
elif activity == 'pelayanan':
if user_activity[chat_id]['state'] == 'chose':
if str(update.message.text).isdigit():
response = requests.get(BASE_URL + 'services/' + str(update.message.text) + '/')
json_response = response.json()
user_response = get_id_user(chat_id)
arrangement_data = {
"user": "http://127.0.0.1:8000/api/users/{}/".format(user_response['id']),
"service": json_response['url'],
"date": "{}".format(datetime.today().strftime('%Y-%m-%d')),
"status": "not verified"
}
print(arrangement_data)
arrangement = requests.post(BASE_URL + "arrangements/", json=arrangement_data)
user_activity[chat_id]["data"] = []
for detail in json_response['detail']:
id, name = str(detail).split('.')
new_file = {
"arrangement": "{}".format(arrangement.json()['url']),
"requirement": "http://127.0.0.1:8000/api/service-requirements/{}/".format(id),
"url_file": None
}
user_activity[chat_id]["data"].append(new_file)
print(user_activity)
id, nama = json_response['detail'][0].split(".")
path = "/" + str(chat_id) + "/" + json_response['type_service'] + "_" + str(time.time()).replace('.',
'_')
try:
os.makedirs(os.getcwd() + path)
user_activity[chat_id]['path'] = os.getcwd() + path
except FileExistsError:
print("Fail Create Folder")
user_activity[chat_id]['state'] = 'upload'
context.bot.send_message(chat_id=chat_id, text="Silahkan Upload " + nama)
else:
context.bot.send_message(chat_id=chat_id, text="Inputan Anda tidak sesuai")
elif user_activity[chat_id]['state'] == 'upload':
print(user_activity)
if update.message.photo is not None:
for data in range(len(user_activity[chat_id]['data'])):
if user_activity[chat_id]['data'][data]['url_file'] is None:
file_id = update.message.photo[-1].file_id
new_file = context.bot.get_file(file_id)
fix_path = user_activity[chat_id]['path'] + "/data" + '_' + str(time.time()).replace('.',
'_') + '.jpg'
user_activity[chat_id]['data'][data]['url_file'] = "{}".format(fix_path)
print("Ini Test : ")
print(user_activity)
new_file.download(fix_path)
if data != len(user_activity[chat_id]['data']) - 1:
requirement = requests.get(user_activity[chat_id]['data'][data + 1]['requirement'])
context.bot.send_message(chat_id=chat_id,
text="Silahkan Kirim " + requirement.json()['name_requirement'])
else:
for file in user_activity[chat_id]['data']:
requests.post(BASE_URL + "file-requirement/", json=file)
context.bot.send_message(chat_id=chat_id,
text="Berkas Anda akan segera diproses dan diverifikasi. Mohon bersabar")
user_activity[chat_id].clear()
break
else:
context.bot.send_message(chat_id=chat_id,
text="Anda salah mengirimkan data, seharusnya data yang anda kirim adalah foto. Silahkan Kirim dengan benar")
else:
context.bot.send_message(chat_id=chat_id, text="Anda kebingungan?")
def list_pelayanan():
response = requests.get(BASE_URL + 'services/')
json_response = response.json()
text = ''
for data in json_response:
text1 = str(data['id']) + '. ' + data['type_service'] + '\n'
text += text1
return text
def pelayanan(update, context):
chat_id = update.message.chat_id
if cek_user(chat_id):
pelayanan_list = list_pelayanan()
text = "Pilih Surat Yang Ingin di Urus :\n\n" + pelayanan_list
user_activity[chat_id] = {
'activity': 'pelayanan',
'state': 'chose',
}
context.bot.send_message(chat_id=chat_id, text=text)
else:
context.bot.send_message(chat_id=chat_id,
text="Anda belum melakukan registrasi, silahkan registrasi dengan /registrasi")
def syarat(update, context):
chat_id = update.message.chat_id
if cek_user(chat_id):
status_syarat[chat_id] = True
pelayanan_list = list_pelayanan()
text = "Pilih Surat Yang Ingin di Urus untuk melihat persyaratan :\n\n" + pelayanan_list
user_activity[chat_id] = {
'activity': 'syarat'
}
context.bot.send_message(chat_id=chat_id, text=text)
else:
context.bot.send_message(chat_id=chat_id,
text="Anda belum melakukan registrasi, silahkan registrasi dengan /registrasi")
def cek_user(telegram_id):
data = {"telegram_id": telegram_id}
response = requests.post(BASE_URL + 'cek-register/', json=data)
return response.json()['status']
def get_id_user(telegram_id):
data = {"telegram_id": telegram_id}
response = requests.post(BASE_URL + 'cek-register/', json=data)
return response.json()
def do_registration(chat_id):
user_activity[chat_id] = {
'activity': 'registration',
'data': {
"telegram_id": str(chat_id),
"name": None,
"status": "unverified",
"url_ktp_photo": None,
"url_self_photo": None
}
}
return "Silahkan ketik nama lengkap anda"
def registration(update, context):
chat_id = update.message.chat_id
if cek_user(chat_id):
context.bot.send_message(chat_id=chat_id, text="Id anda telah terdaftar dalam database")
else:
if chat_id in user_activity:
context.bot.send_message(chat_id=chat_id,
text="Registrasi tidak dapat dilakukan karena anda berada pada aktifitas lain")
else:
text = do_registration(chat_id)
context.bot.send_message(chat_id=chat_id, text=text)
def start(update, context):
chat_id = update.message.chat_id
context.bot.send_message(chat_id=chat_id, text="Selamat Datang Pada Smart Lurah Bot. Apabila anda belum melakukan "
"registrasi, silahkan lakukan registrasi dengan mengetik "
"/registrasi . Jika anda telah melakukan registrasi, anda dapat "
"melihat petunjuk pemakaian dengan mengetik /info")
def info(update, context):
chat_id = update.message.chat_id
context.bot.send_message(chat_id=chat_id, text=
"""Berikut tutorial dalam menggunakan bot ini untuk mengurus berkas yang dibutuhkan:
1. Silahkan Lihat berkas persyaratan untuk mengurus surat yang anda inginkan dengan mengetik /syarat.
2. Persiapkan semua berkas persyaratan yang dibutuhkan
3. Apabila berkas persyaratan telah siap maka anda dapat melakukan permintaan pelayanan surat dengan mengetik /pelayanan
4. Selanjutnya pilih surat apa yang ingin anda urus
5. Kemudian isi dan upload berkas persyaratan sesuai instruksi bot
6. Setelah selesai upload, silahkan tunggu verifikasi dari petugas pelayanan kelurahan
7. Apabila berkas anda tidak lolos registrasi maka anda akan mendapat pesan penolakan dengan alasan penolakan. Perbaiki berkas sesuai instruksi yang telah diberitahukan oleh petugas pelayanan kelurahan.Kemudian lakukan pengajuan ulang mulai nomor 3
8. Apabila berkas anda lolos verifikasi maka tunggu lagi pemberitahuan untuk mengambil berkas dikelurahan
9. Setelah mendapat pesan bahwa surat telah dapat diambil maka pergilah ke kelurahan dengan membawa berkas persyaratan pada nomor 2 dalam bentuk fisik sebagai verifikasi pengambilan surat
10. Setelah berkas fisik lolos verifikasi maka anda akan menerima surat yang anda butuhkan""")
def main():
updater = Updater('', use_context=True)#Untuk id bot saya sembunyikan karena takut disalah gunakan orang lain
dp = updater.dispatcher
dp.add_handler(CommandHandler('start', start))
dp.add_handler(CommandHandler('info', info))
dp.add_handler(CommandHandler('syarat', syarat))
dp.add_handler(CommandHandler('registrasi', registration))
dp.add_handler(CommandHandler('pelayanan', pelayanan))
dp.add_handler(MessageHandler(Filters.all, brain))
dp.add_error_handler(error_callback)
updater.start_polling()
updater.idle()
if __name__ == '__main__':
main()
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment