From b9465d8ed39a339202e1164ee6b9078287e918b6 Mon Sep 17 00:00:00 2001 From: alazhar Date: Wed, 8 Jul 2020 08:58:22 +0700 Subject: [PATCH] init file --- src/Code.js | 44 +++++++++ src/MathCaptcha.js | 242 +++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 286 insertions(+) create mode 100644 src/Code.js create mode 100644 src/MathCaptcha.js diff --git a/src/Code.js b/src/Code.js new file mode 100644 index 0000000..9f44965 --- /dev/null +++ b/src/Code.js @@ -0,0 +1,44 @@ +bot = new tgbot.getBot(token) +bot.enableErrorLogging(owner) +Utils = tgbot.Utils +Button = tgbot.Button + +function setWebhook() { + var result = bot.setWebhook({ + url: webhook_url + }); + Logger.log(result); +} + +function getMe() { + var result = bot.getMe({ + url: webhook_url + }); + Logger.log(result); +} + +function doPost(e) { + if(e.postData.type == "application/json") { + update = JSON.parse(e.postData.contents) + + bot.onMessage(/\/start$/, function(e){ + if (e.message.chat.type == 'supergroup') { + e.respond('👋 Halo semua. Terimakasih sudah menambahkan saya kedalam grup. Saya dapat melakukan verifikasi ' + + 'kepada member baru yang gabung ke dalam grup ini. Syaratnya jadikan saya sebagai admin') + return + } + else if (e.message.chat.type == 'private'){ + e.respond('👋 Halo *' + Utils.getDisplayName(e.message.from) + '*. Saya dapat membantu melakukan verifikasi ' + + 'kepada member baru yang gabung ke dalam grup. Caranya, tambahkan saya kedalam grup dan jadikan saya sebagai admin', + undefined, undefined, + Utils.inlineKeyboard([[Button.url('Tambahkan ke grup','t.me/mathcaptchabot?startgroup=new')]])) + return + } + }); + + bot.registerClass(new MathCaptcha()) + if (update) { + bot.processUpdate(update); + } + } +} diff --git a/src/MathCaptcha.js b/src/MathCaptcha.js new file mode 100644 index 0000000..b535911 --- /dev/null +++ b/src/MathCaptcha.js @@ -0,0 +1,242 @@ +class MathCaptcha { + constructor(){ + this.triggers = [ + '###(new_chat_members)', + '/start (CAPTCHA)(\\d+)' + ] + this.callbackTriggers = [ + 'captcha:(\\d+):(\\d+)' + ] + this.inlineTriggers = [] + this.prop = PropertiesService.getScriptProperties() + } + + kickMember(bot, chat_id, user_id){ + bot.kickChatMember({ + 'chat_id': chat_id, + 'user_id': user_id + }) + + bot.unbanChatMember({ + 'chat_id': chat_id, + 'user_id': user_id + }) + } + + muteMember(bot,chat_id,user_id){ + bot.restrictChatMember({ + 'chat_id': chat_id, + 'user_id': user_id, + 'permissions' : { + 'can_send_messages' : false + } + }) + } + + unmuteMember(bot,chat_id,user_id){ + bot.restrictChatMember({ + 'chat_id': chat_id, + 'user_id': user_id, + 'permissions' : { + 'can_send_messages' : true, + 'can_send_media_messages' : true, + 'can_send_polls' : true, + 'can_send_other_messages' : true, + 'can_add_web_page_previews' : true, + 'can_change_info' : true, + 'can_invite_users' : true, + 'can_pin_messages' : true, + } + }) + } + + // Cari id captcha untuk user di grup + // jika belum ada, buat yang baru dengan id terakhir + getCaptchaID(bot,chat_id,user_id){ + let props = bot.obj.prop.getProperties() + let i + for (i in props) { + if (i.startsWith("CAPTCHA#")){ + let val = props[i] + let data = JSON.parse(val) + if (data.chat_id == chat_id && data.user_id == user_id){ + return i + } + } + } + let last_id = bot.obj.prop.getProperty('last_id') + if (!last_id) last_id = 0 + last_id = parseInt(last_id) + 1 + bot.obj.prop.setProperty('last_id', parseInt(last_id)) + return 'CAPTCHA#' + last_id + } + + onMessage(e){ + let msg = e.message + let ME = e.getMe() + + // Jika ada update member baru gabung + if (e.match[1] == 'new_chat_members'){ + // Cek privilege bot. Jika tidak ada restric privilege abaikan update + let my_permission = e.getChatMember({'chat_id':msg.chat.id,'user_id':ME.id}) + if (my_permission.can_restrict_members){ + // Looping setiap member baru + let i + for (i of msg.new_chat_members){ + let user = i + + // Cek jika user adalah bot + if (user.is_bot){ + continue + } + + // Buat captcha + let user_name = Utils.getDisplayName(user) + let captcha_id = this.obj.getCaptchaID(this,msg.chat.id, user.id) + let max = 49 + let min = 1 + let num1 = Math.floor(Math.random() * (max - min + 1)) + min + let num2 = Math.floor(Math.random() * (max - min + 1)) + min + let question = num1 + ' + ' + num2 + let answer = num1 + num2 + let choice = [answer] + max = 99 + choice.push(Math.floor(Math.random() * (max - min + 1)) + min) + choice.push(Math.floor(Math.random() * (max - min + 1)) + min) + choice.push(Math.floor(Math.random() * (max - min + 1)) + min) + + // Kirim pesan ke grup buat meminta user baru untuk verifikasi + let res = e.respond( + 'Halo [' + user_name + '](tg://user?id=' + user.id + '), mohon verifikasi dengan menekan tombol dibawah untuk dapat mengirim pesan ke grup ini ', + undefined, undefined, + Utils.inlineKeyboard([[Button.url('Verifikasi','t.me/' + ME.username + '?start=' + captcha_id.replace('#',''))]]) + ) + + let captcha = { + 'chat_id' : msg.chat.id, + 'chat_title' : msg.chat.title, + 'user_id': user.id, + 'user_name': user_name, + 'question': question, + 'answer': answer, + 'choice': choice, + 'chance': 3, + 'msg_id': res.message.message_id + } + + // Ganti restriction member + this.obj.muteMember(this,msg.chat.id, user.id) + + // Simpan properti + this.obj.prop.setProperty(captcha_id, JSON.stringify(captcha)) + } + return + } + } + + // Jika user menekan tombol verifikasi + if (e.match[1] == 'CAPTCHA'){ + let id_captcha = e.match[2] + let captcha = this.obj.prop.getProperty('CAPTCHA#' + id_captcha) + + // Cek apakah ada captcha tersimpan dengan ID tersebut + if (captcha){ + captcha = JSON.parse(captcha) + + // Cek apakah user yang menekan tombol adalah member baru + if (captcha.user_id == msg.from.id){ + let user_name = captcha.user_name + let chat_title = captcha.chat_title + let question = captcha.question + let answer = captcha.answer + let chance = captcha.chance + let choice = captcha.choice + choice = Utils.shuffleArray(choice) + + // Kirim captcha + e.respond('Hi *' + user_name + '* mohon selesaikan perhitungan matematika dibawah untuk verifikasi anda di grup *' + chat_title + '*' + + '\nKamu punya `' + chance + '` kali kesempatan' + + '\n\n*Pertanyaan* : `' + question + '`',undefined, undefined, + Utils.inlineKeyboard( + [ + [ + Button.inline('A. ' + choice[0], `captcha:${id_captcha}:${choice[0]}`), + Button.inline('B. ' + choice[1], `captcha:${id_captcha}:${choice[1]}`) + ], + [ + Button.inline('C. ' + choice[2], `captcha:${id_captcha}:${choice[2]}`), + Button.inline('D. ' + choice[3], `captcha:${id_captcha}:${choice[3]}`) + ] + ] + ) + ) + } + } + } + } + + onCallbackQuery(e){ + let id_captcha = e.match[1] + let user_choice = e.match[2] + let captcha = this.obj.prop.getProperty('CAPTCHA#' + id_captcha) + if (captcha){ + captcha = JSON.parse(captcha) + if (captcha.user_id == captcha.user_id){ + let user_name = captcha.user_name + let chat_title = captcha.chat_title + let chance = captcha.chance + let question = captcha.question + let answer = captcha.answer + + // Jika jawaban salah + if (user_choice != answer){ + e.answer('Jawaban kamu salah') + // Jika kesempatan sudah abis, kick member + if (chance == 1){ + e.edit('Kesempatan kamu habis, kamu sudah dikeluarkan dari grup') + e.deleteMessage({'chat_id':captcha.chat_id, 'message_id':captcha.msg_id}) + e.sendMessage({'chat_id':captcha.chat_id, 'text': 'ℹī¸ *' + user_name + '* telah dikeluarkan dari grup karna tidak dapat melakukan verifikasi'}) + this.obj.kickMember(this,captcha.chat_id, captcha.user_id) + this.obj.prop.deleteProperty('CAPTCHA#' + id_captcha) + } + + // Jika masih memiliki kesempatan, acak jawaban + else{ + chance = chance - 1 + captcha.chance = chance + let choice = captcha.choice + choice = Utils.shuffleArray(choice) + e.edit('Hi *' + user_name + '* mohon selesaikan perhitungan matematika dibawah untuk verifikasi anda di grup *' + chat_title + '*' + + '\nKamu punya `' + chance + '` kali kesempatan' + + '\n\n*Pertanyaan* : `' + question + '`',undefined, undefined, + Utils.inlineKeyboard( + [ + [ + Button.inline('A. ' + choice[0], `captcha:${id_captcha}:${choice[0]}`), + Button.inline('B. ' + choice[1], `captcha:${id_captcha}:${choice[1]}`) + ], + [ + Button.inline('C. ' + choice[2], `captcha:${id_captcha}:${choice[2]}`), + Button.inline('D. ' + choice[3], `captcha:${id_captcha}:${choice[3]}`) + ] + ] + ) + ) + this.obj.prop.setProperty('CAPTCHA#' + id_captcha, JSON.stringify(captcha)) + } + } + // Jika jawaban salah + else{ + e.edit('👍 Yapp!! Jawaban kamu benar. Kamu dapat mengirim pesan di grup. Terimakasih sudah verifikasi 😊') + e.deleteMessage({'chat_id':captcha.chat_id, 'message_id':captcha.msg_id}) + this.obj.unmuteMember(this,captcha.chat_id, captcha.user_id) + this.obj.prop.deleteProperty('CAPTCHA#' + id_captcha) + e.answer() + } + } + } + } + + onInlineQuery(e){ + } +} \ No newline at end of file