This repository has been archived on 2024-10-24. You can view files and clone it, but cannot push or open issues or pull requests.
NG_KillSwitch/tg.py

192 lines
7.3 KiB
Python
Raw Normal View History

2023-01-31 13:27:10 +00:00
# Project: Telegram PC kill switch bot
# Author: Stanislav Mykhailenko
# License: Unlicense
# This file contains Telegram interactions
2023-01-31 14:59:00 +00:00
from config import *
2023-01-31 13:27:10 +00:00
from telegram import ReplyKeyboardMarkup, ReplyKeyboardRemove, Update
from telegram.ext import Application, CommandHandler, ContextTypes, ConversationHandler, filters, MessageHandler
from payload import *
2023-02-01 17:38:20 +00:00
import logging, googledrive
2023-01-31 13:27:10 +00:00
from threading import Thread
logging.basicConfig(
format='%(asctime)s - %(name)s - %(levelname)s - %(message)s',
level=logging.INFO
)
logger = logging.getLogger(__name__)
2023-02-01 17:38:20 +00:00
PASSWORD, ACTION, FORMAT, MESSAGE, FILE_MANAGER, LIST, DELETE, UPLOAD = range(8)
2023-01-31 13:27:10 +00:00
2023-01-31 14:59:00 +00:00
async def start(update: Update, context: ContextTypes.DEFAULT_TYPE) -> int:
await update.message.reply_text("Enter password.")
2023-01-31 13:27:10 +00:00
2023-01-31 14:59:00 +00:00
return PASSWORD
2023-01-31 13:27:10 +00:00
2023-02-01 17:38:20 +00:00
async def action_keyboard(update: Update):
reply_keyboard = [["Enable input", "Disable input", "Lock screen", "Format volumes", "Play message", "File manager"]]
2023-01-31 14:59:00 +00:00
await update.message.reply_text(
"Choose your action:",
reply_markup=ReplyKeyboardMarkup(
reply_keyboard, one_time_keyboard=True, input_field_placeholder="Choose your action"
),
)
2023-02-01 17:38:20 +00:00
async def file_keyboard(update: Update):
reply_keyboard = [["List files", "Upload files", "Delete files", "Go back"]]
await update.message.reply_text(
"Choose your action:",
reply_markup=ReplyKeyboardMarkup(
reply_keyboard, one_time_keyboard=True, input_field_placeholder="Choose your action"
),
)
2023-01-31 14:59:00 +00:00
async def password(update: Update, context: ContextTypes.DEFAULT_TYPE) -> int:
user = update.message.from_user
if update.message.text == master_password:
logger.info("User %s logged in.", user.first_name)
2023-02-01 17:38:20 +00:00
await action_keyboard(update)
2023-01-31 14:59:00 +00:00
return ACTION
2023-01-31 13:27:10 +00:00
2023-01-31 14:59:00 +00:00
logger.info("User %s failed to log in.", user.first_name)
await update.message.reply_text("Wrong password entered, please try again.")
2023-01-31 13:27:10 +00:00
2023-01-31 14:59:00 +00:00
return PASSWORD
2023-01-31 13:27:10 +00:00
async def action(update: Update, context: ContextTypes.DEFAULT_TYPE) -> int:
user = update.message.from_user
match update.message.text:
case "Enable input":
logger.info("Got a request from %s to enable input.", user.first_name)
enableInput()
await update.message.reply_text("Input enabled.", reply_markup=ReplyKeyboardRemove())
2023-02-01 17:38:20 +00:00
await action_keyboard(update)
2023-01-31 14:59:00 +00:00
return ACTION
2023-01-31 13:27:10 +00:00
case "Disable input":
logger.info("Got a request from %s to disable input.", user.first_name)
disableInput()
await update.message.reply_text("Input disabled.", reply_markup=ReplyKeyboardRemove())
2023-02-01 17:38:20 +00:00
await action_keyboard(update)
2023-01-31 14:59:00 +00:00
return ACTION
2023-01-31 13:27:10 +00:00
case "Lock screen":
logger.info("Got a request from %s to lock screen.", user.first_name)
lockScreen()
await update.message.reply_text("Screen locked.", reply_markup=ReplyKeyboardRemove())
2023-02-01 17:38:20 +00:00
await action_keyboard(update)
2023-01-31 14:59:00 +00:00
return ACTION
2023-01-31 13:27:10 +00:00
case "Format volumes":
logger.info("Got a request from %s to format volumes.", user.first_name)
2023-02-01 17:38:20 +00:00
await update.message.reply_text("Please enter a space-separated list of the volumes you want to format.", reply_markup=ReplyKeyboardRemove())
2023-01-31 13:27:10 +00:00
return FORMAT
case "Play message":
logger.info("Got a request from %s to play a message.", user.first_name)
2023-02-01 17:38:20 +00:00
await update.message.reply_text("Please enter the message you want to play.", reply_markup=ReplyKeyboardRemove())
2023-01-31 13:27:10 +00:00
return MESSAGE
2023-02-01 17:38:20 +00:00
case "File manager":
await file_keyboard(update)
return FILE_MANAGER
async def file_manager(update: Update, context: ContextTypes.DEFAULT_TYPE) -> int:
user = update.message.from_user
match update.message.text:
case "List files":
logger.info("Got a request from %s to list files.", user.first_name)
await update.message.reply_text("Please enter the path.", reply_markup=ReplyKeyboardRemove())
return LIST
case "Upload files":
logger.info("Got a request from %s to upload files.", user.first_name)
await update.message.reply_text("Please enter the path.", reply_markup=ReplyKeyboardRemove())
return UPLOAD
case "Delete files":
logger.info("Got a request from %s to delete files.", user.first_name)
await update.message.reply_text("Please enter the path.", reply_markup=ReplyKeyboardRemove())
return DELETE
case "Go back":
await action_keyboard(update)
return ACTION
2023-01-31 13:27:10 +00:00
async def format(update: Update, context: ContextTypes.DEFAULT_TYPE) -> int:
user = update.message.from_user
logger.info("Got a request from %s to format volumes %s.", user.first_name, update.message.text)
Thread(target=formatVolumes,args=(update.message.text.split(),)).start()
await update.message.reply_text("Command to format the volumes sent.")
2023-02-01 17:38:20 +00:00
await action_keyboard(update)
2023-01-31 14:59:00 +00:00
return ACTION
2023-01-31 13:27:10 +00:00
async def message(update: Update, context: ContextTypes.DEFAULT_TYPE) -> int:
user = update.message.from_user
logger.info("Got a request from %s to play message %s.", user.first_name, update.message.text)
Thread(target=playMessage,args=(update.message.text,)).start()
await update.message.reply_text("Command to play the message sent.")
2023-02-01 17:38:20 +00:00
await action_keyboard(update)
2023-01-31 14:59:00 +00:00
return ACTION
2023-01-31 13:27:10 +00:00
2023-02-01 17:38:20 +00:00
async def list(update: Update, context: ContextTypes.DEFAULT_TYPE) -> int:
user = update.message.from_user
logger.info("Got a request from %s to list files at %s.", user.first_name, update.message.text)
await update.message.reply_text(listData(os.path.join(update.message.text)))
await file_keyboard(update)
return FILE_MANAGER
async def upload(update: Update, context: ContextTypes.DEFAULT_TYPE) -> int:
user = update.message.from_user
logger.info("Got a request from %s to upload %s.", user.first_name, update.message.text)
Thread(target=uploadData,args=(os.path.join(update.message.text),)).start()
await update.message.reply_text("Command to upload the data sent.")
await file_keyboard(update)
return FILE_MANAGER
async def delete(update: Update, context: ContextTypes.DEFAULT_TYPE) -> int:
user = update.message.from_user
logger.info("Got a request from %s to delete %s.", user.first_name, update.message.text)
Thread(target=deleteData,args=(os.path.join(update.message.text),)).start()
await update.message.reply_text("Command to delete the data sent.")
await file_keyboard(update)
return FILE_MANAGER
2023-01-31 13:27:10 +00:00
async def cancel(update: Update, context: ContextTypes.DEFAULT_TYPE) -> int:
user = update.message.from_user
2023-01-31 14:59:00 +00:00
logger.info("User %s cancelled the conversation.", user.first_name)
2023-01-31 13:27:10 +00:00
await update.message.reply_text("Request cancelled.", reply_markup=ReplyKeyboardRemove())
return ConversationHandler.END
def startBot():
2023-01-31 14:59:00 +00:00
application = Application.builder().token(token).build()
2023-01-31 13:27:10 +00:00
conv_handler = ConversationHandler(
entry_points=[CommandHandler("start", start)],
states={
2023-01-31 14:59:00 +00:00
PASSWORD: [MessageHandler(filters.TEXT & ~filters.COMMAND, password)],
2023-02-01 17:38:20 +00:00
ACTION: [MessageHandler(filters.Regex("^(Enable input|Disable input|Lock screen|Format volumes|Play message|File manager)$"), action)],
2023-01-31 13:27:10 +00:00
FORMAT: [MessageHandler(filters.TEXT & ~filters.COMMAND, format)],
MESSAGE: [MessageHandler(filters.TEXT & ~filters.COMMAND, message)],
2023-02-01 17:38:20 +00:00
FILE_MANAGER: [MessageHandler(filters.Regex("^(List files|Upload files|Delete files|Go back)$"), file_manager)],
LIST: [MessageHandler(filters.TEXT & ~filters.COMMAND, list)],
DELETE: [MessageHandler(filters.TEXT & ~filters.COMMAND, delete)],
UPLOAD: [MessageHandler(filters.TEXT & ~filters.COMMAND, upload)],
2023-01-31 13:27:10 +00:00
},
fallbacks=[CommandHandler("cancel", cancel)],
)
application.add_handler(conv_handler)
application.run_polling()