import sys import os import threading import time import bot import asyncio from os.path import exists from BotResources import check_if_config_exists, write_config_file, read_config_file, get_device_list from PyQt6 import QtWidgets, QtGui from PyQt6.QtCore import QObject, pyqtSignal, QThread from PyQt6.QtWidgets import QMainWindow, QApplication # Jorn #token = 'OTE1MDY0OTk2OTk0NjMzNzI5.YaWKsA.Y9yaCGg_VXRL_qQVbs05vo7gSAc' # Greada #token = 'NzU2MzI3MjcxNTk3NDczODYz.X2QOqQ.LVLj2b-RXQzPmhNuBC1eGFMcYls' #name = "VoiceMeeter Output" class CreateConfigFile(): def __init__(self, **kwargs): write_config_file(**kwargs) class BotWorker(threading.Thread): def __init__(self, config): super(BotWorker, self).__init__() self.config = config self.discord_bot_client = bot.Bot(Token=self.config['Token'], Device_ID=self.config['Device ID'], Device_Name=self.config['Device Name'], Mention_Group=self.config['Mention Group'], Channel_ID=self.config['Channel ID']) print(f"Verifying audio device:\t{self.config['Device Name']}") if not self.discord_bot_client.check_device(): raise BotDeviceNotFound(self.config['Device Name']) def run(self): print("Bot started!") self.discord_bot_client.start_bot() async def stop_bot(self): print("Stopping Bot") await self.discord_bot_client.stop_bot() print("ASD") class mainWindow(QMainWindow): def __init__(self): super(mainWindow, self).__init__() print('Checking config file...') if check_if_config_exists(): self.config = read_config_file() else: self.config = None windowDimensions, uiInformation = self.createInitVars() self.windowDimensions = windowDimensions self.uiInformation = uiInformation self.device_list = get_device_list() self.bot_thread = None ### UI Init self.labelDevice = QtWidgets.QLabel(self) self.contextEditMenu = QtWidgets.QMenu("&Edit", self) self.contextFileMenu = QtWidgets.QMenu("&File", self) self.btn1 = QtWidgets.QPushButton(self) self.btn2 = QtWidgets.QPushButton(self) self.btn3 = QtWidgets.QPushButton(self) self.labelTitle = QtWidgets.QLabel(self) self.labelToken = QtWidgets.QLabel(self) self.labelMention_Group = QtWidgets.QLabel(self) self.labelChannel_ID = QtWidgets.QLabel(self) self.lineToken = QtWidgets.QLineEdit(self) self.lineMention_Group = QtWidgets.QLineEdit(self) self.lineChannel_ID = QtWidgets.QLineEdit(self) self.comboDevice = QtWidgets.QComboBox(self) self.contextMenuBar = self.menuBar() self.createUI() def createUI(self): # Load Icon if one exists if exists('./icon.png'): self.setWindowIcon(QtGui.QIcon('./icon.png')) # Loading text and UI variables buttons = self.uiInformation['buttons'] labels = self.uiInformation['labels'] # Button 1 - Connect Bot self.btn1.setText(buttons['btn1']['Text']) self.btn1.clicked.connect(self.btn1Clicked) self.btn1.move(self.windowDimensions['Width'] - 220, self.windowDimensions['Height'] - 40) # Button 2 - Disconnect Bot self.btn2.setText(buttons['btn2']['Text']) self.btn2.setEnabled(False) self.btn2.clicked.connect(self.btn2Clicked) self.btn2.move(self.windowDimensions['Width'] - 110, self.windowDimensions['Height'] - 40) # Button 3 - Save Config self.btn3.setText(buttons['btn3']['Text']) self.btn3.clicked.connect(self.btn3Clicked) self.btn3.move(15, self.windowDimensions['Height'] - 40) ### Label Init # Title self.labelTitle.setText(labels['lblTitle']['Text']) self.labelTitle.move(15, 30) self.labelTitle.adjustSize() # Token self.labelToken.setText(labels['lblToken']['Text']) self.labelToken.move(15, 70) # Device self.labelDevice.setText(labels['lblDevice']['Text']) self.labelDevice.move(15, 190) # Mention Group self.labelMention_Group.setText(str(labels['lblMention_Group']['Text'])) self.labelMention_Group.move(15, 150) self.labelMention_Group.adjustSize() # Channel ID self.labelChannel_ID.setText(str(labels['lblChannel_ID']['Text'])) self.labelChannel_ID.move(15, 110) self.labelChannel_ID.adjustSize() ### Line Edit Init # Token self.lineToken.move(150, 75) self.lineToken.resize(420, 28) if self.config: if 'Token' in self.config.keys(): self.lineToken.setText(self.config['Token']) # Channel ID self.lineChannel_ID.move(150, 115) self.lineChannel_ID.resize(420, 28) if self.config: if 'Channel ID' in self.config.keys(): self.lineChannel_ID.setText(str(self.config['Channel ID'])) # Mention Group self.lineMention_Group.move(150, 155) self.lineMention_Group.resize(420, 28) if self.config: if 'Mention Group' in self.config.keys(): self.lineMention_Group.setText(self.config['Mention Group']) # Device for device, dev_id in self.device_list: self.comboDevice.addItem(device) self.comboDevice.move(150, 195) self.comboDevice.resize(420, 28) if self.config: if 'Device Name' in self.config.keys(): self.comboDevice.setCurrentText(self.config['Device Name']) ### Window Setup self.setGeometry(self.windowDimensions['Xpos'], self.windowDimensions['Ypos'], self.windowDimensions['Width'], self.windowDimensions['Height']) self.setFixedSize(self.windowDimensions['Width'], self.windowDimensions['Height']) self.setWindowTitle(self.uiInformation['Title']) # Creating file menu self.contextMenuBar.addMenu(self.contextFileMenu) # Creating edit menu self.contextMenuBar.addMenu(self.contextEditMenu) self.show() def btn1Clicked(self): if not self.config: if len(self.lineToken.text()) == 59 and self.comboDevice.currentText() and len( str(self.lineChannel_ID.text())) == len( str("918029426397184000")) and self.lineMention_Group.text(): self.update_config() CreateConfigFile(token=str(self.lineToken.text()), device_name=self.config['Device Name'], device_id=self.config['Device ID'], channel_id=self.lineChannel_ID.text(), mention_group=self.lineMention_Group.text()) self.config = read_config_file() try: clearance = 0 if self.update_config(): clearance += 1 if len(self.lineToken.text()) == 59: clearance += 2 if clearance == 3: self.bot_thread = BotWorker(self.config) self.bot_thread.daemon = True self.bot_thread.start() elif clearance < 3: raise Exception("Error in ID or Device") except Exception as e: print(e) def btn2Clicked(self): try: asyncio.run(self.bot_thread.stop_bot()) self.bot_thread = BotWorker(self.config) except Exception as e: print(e) return def btn3Clicked(self): print(len(self.lineToken.text())) print(len(str(self.lineChannel_ID.text()))) print(self.comboDevice.currentText()) if len(self.lineToken.text()) == 59 and self.comboDevice.currentText() and len( str(self.lineChannel_ID.text())) == len( str("918029426397184000")) and self.lineMention_Group.text(): print('saving.....') self.update_config() CreateConfigFile(token=str(self.lineToken.text()), device_name=self.config['Device Name'], device_id=self.config['Device ID'], channel_id=self.lineChannel_ID.text(), mention_group=self.lineMention_Group.text()) self.config = read_config_file() print("Saved config") return def update_config(self): if not self.config: self.config = {} for device, device_id in get_device_list(): if device == self.comboDevice.currentText(): self.config['Device ID'] = device_id self.config['Device Name'] = device return True return False def createInitVars(self): windowDimensions = \ { 'Xpos': 400, 'Ypos': 300, 'Width': 600, 'Height': 325 } uiInformation = \ { 'Title': "Simple Step Time Tracking", 'buttons': { 'btn1': { 'Text': "Connect Bot" }, 'btn2': { 'Text': "Disconnect Bot" }, 'btn3': { 'Text': "Save Config" } }, 'labels': { 'lblTitle': { 'Text': "Please enter the fields below and click Connect!" }, 'lblToken': { 'Text': "Bot Token:" }, 'lblChannel_ID': { 'Text': "Default Text Channel ID:" }, 'lblMention_Group': { 'Text': "Default Mention Group:" }, 'lblDevice': { 'Text': "Input Device:" }, 'lblActivity': { 'Text': "Activitiy" }, 'lblDescription': { 'Text': "Description" } } } return windowDimensions, uiInformation class BotDeviceNotFound(Exception): def __init__(self, device): print(f"Unable to find the device: {device}") try: os.remove('./config.ini') except OSError: print("Config file not found, restarting.") #os.execv(__file__, sys.argv) def main(): print('Starting Bot...') try: app = QApplication(sys.argv) window = mainWindow() sys.exit(app.exec()) except Exception as e: print(e) if __name__ == '__main__': try: print('Starting...') while True: try: main() except (BotDeviceNotFound, Exception) as e: print(e) print("Restarting...") time.sleep(2) except (KeyboardInterrupt, Exception) as e: print(e) print("Exiting...")