from phBot import * import QtBind from threading import Timer from datetime import datetime from datetime import timedelta import struct import random import json import os import subprocess import urllib.request name = 'TR_Academy' version = '2.0' NewestVersion = 0 SEQUENCE_DEFAULT_NUMBER = 100 NOTIFICATION_SOUND_PATH = 'c:\\Windows\\Media\\chimes.wav' isCreatingCharacter = False isDeletingCharacter = False CreatingNickname = "" isRestarted = False gui = QtBind.init(__name__,name) cbxEnabled = QtBind.createCheckBox(gui,'cbxDoNothing',' Etkin ',6,9) _x = 350 _y = 10 lblProfileName = QtBind.createLabel(gui,"Yapılandırma Profil Adı:",_x-10,_y) tbxProfileName = QtBind.createLineEdit(gui,"",_x+102,_y-3,110,19) btnSaveConfig = QtBind.createButton(gui,'btnSaveConfig_clicked'," Kaydet ",_x+102+110+3,_y-5) btnLoadConfig = QtBind.createButton(gui,'btnLoadConfig_clicked'," Yükle ",_x+102+110+3+75,_y-5) _x = 6 _y = 40 cbxSelectChar = QtBind.createCheckBox(gui,'cbxDoNothing','Seç: 1-40Lv',_x,_y-1) cbxSelectChar2 = QtBind.createCheckBox(gui,'cbxDoNothing','Seç: 1-29Lv',_x+80,_y-1) cbxSelectChar3 = QtBind.createCheckBox(gui,'cbxDoNothing','Seç: 1-20Lv',_x+160,_y-1) cbxSelectCharOnAcademy = QtBind.createCheckBox(gui,'cbxDoNothing','Seç: 40-50Lv',_x+240,_y-1) _y+=20 cbxCreateChar = QtBind.createCheckBox(gui,'cbxDoNothing','Oluştur',_x,_y-1) _y+=20 cbxDeleteChar = QtBind.createCheckBox(gui,'cbxDoNothing','Sil (40-50Lv Arasındaki Karakterler.',_x,_y-1) _x = 518 _y = 40 lblNickname = QtBind.createLabel(gui,"Karakter Adı:",_x,_y) tbxNickname = QtBind.createLineEdit(gui,"",_x+77,_y-3,102,19) _y+=20 lblSequence = QtBind.createLabel(gui,"Karakter Sayısı:",_x,_y) tbxSequence = QtBind.createLineEdit(gui,"",_x+77,_y-3,102,19) _y+=20 lblRace = QtBind.createLabel(gui,"Karakter Irkı:",_x,_y) cmbxRace = QtBind.createCombobox(gui,_x+77,_y-3,102,19) QtBind.append(gui,cmbxRace,"CH") QtBind.append(gui,cmbxRace,"EU") lblNot = QtBind.createLabel(gui,'Not: Karakterler
EU ise Robe/Wizard
CH ise SS/Garment
Açılacaktır.', 520, 115) # Some actions _y = 130 _x = 6 lblFullCharacters = QtBind.createLabel(gui,"Daha Fazla Karakter Oluşumu Yapamazsa Alınacak Aksiyon:",_x,_y) _y+=20 lblCMD = QtBind.createLabel(gui,"Sistem Komutunu Çalıştır (CMD) :",_x+10,_y) tbxCMD = QtBind.createLineEdit(gui,"",175,_y-3,205,19) _y+=20 cbxExit = QtBind.createCheckBox(gui,'cbxDoNothing','Botu Kapat.',_x+9,_y) _y+=20 cbxNotification_Full = QtBind.createCheckBox(gui,'cbxDoNothing','phBot Bildiriminde Göster.',_x+9,_y) _y+=20 cbxSound_Full = QtBind.createCheckBox(gui,'cbxDoNothing','Ses Çal, Dosya Yolu : ',_x+9,_y) tbxSound_Full = QtBind.createLineEdit(gui,'',138,_y-1,240,20) _y+=20 cbxLog_Full = QtBind.createCheckBox(gui,'cbxDoNothing','Kayıt Dosyası Oluştur.',_x+9,_y) def getPath(): return get_config_dir()+name+"\\" def getConfig(name): if not name: name = name; return getPath()+name+".json" def loadDefaultConfig(): QtBind.setText(gui,tbxProfileName,"") QtBind.setChecked(gui,cbxEnabled,False) QtBind.setChecked(gui,cbxSelectChar,True) QtBind.setChecked(gui,cbxSelectChar2,False) QtBind.setChecked(gui,cbxSelectChar3,False) QtBind.setChecked(gui,cbxCreateChar,True) QtBind.setChecked(gui,cbxDeleteChar,True) QtBind.setChecked(gui,cbxSelectCharOnAcademy,False) QtBind.setText(gui,tbxNickname,"") QtBind.setText(gui,tbxSequence,str(SEQUENCE_DEFAULT_NUMBER)) QtBind.setText(gui,cmbxRace,"CH") QtBind.setText(gui,tbxCMD,"") QtBind.setChecked(gui,cbxNotification_Full,False) QtBind.setChecked(gui,cbxSound_Full,False) QtBind.setText(gui,tbxSound_Full,NOTIFICATION_SOUND_PATH) QtBind.setChecked(gui,cbxLog_Full,False) QtBind.setChecked(gui,cbxExit,False) def loadConfigs(fileName=""): loadDefaultConfig() if os.path.exists(getConfig(fileName)): data = {} with open(getConfig(fileName),"r") as f: data = json.load(f) QtBind.setText(gui,tbxProfileName,fileName) if "Enabled" in data and data['Enabled']: QtBind.setChecked(gui,cbxEnabled,True) if "SelectChar" in data and not data['SelectChar']: QtBind.setChecked(gui,cbxSelectChar,False) if "SelectChar2" in data and not data['SelectChar2']: QtBind.setChecked(gui,cbxSelectChar2,False) if "SelectChar3" in data and not data['SelectChar3']: QtBind.setChecked(gui,cbxSelectChar3,False) if "CreateChar" in data and not data['CreateChar']: QtBind.setChecked(gui,cbxCreateChar,False) if "DeleteChar" in data and not data['DeleteChar']: QtBind.setChecked(gui,cbxDeleteChar,False) if "SelectCharOnAcademy" in data and data['SelectCharOnAcademy']: QtBind.setChecked(gui,cbxSelectCharOnAcademy,True) if "Nickname" in data: QtBind.setText(gui,tbxNickname,data["Nickname"]) if "Sequence" in data and data["Sequence"]: QtBind.setText(gui,tbxSequence,data["Sequence"]) if "Race" in data: QtBind.setText(gui,cmbxRace,data["Race"]) if "CMD" in data: QtBind.setText(gui,tbxCMD,data["CMD"]) if "NotificationFull" in data and data['NotificationFull']: QtBind.setChecked(gui,cbxNotification_Full,True) if "SoundFull" in data and data['SoundFull']: QtBind.setChecked(gui,cbxNotification_Full,True) if "SoundFullPath" in data and data["SoundFullPath"]: QtBind.setText(gui,tbxSound_Full,data["SoundFullPath"]) if "LogFull" in data and data['LogFull']: QtBind.setChecked(gui,cbxLog_Full,True) if "Exit" in data and data['Exit']: QtBind.setChecked(gui,cbxExit,True) return True return False def saveConfigs(fileName=""): data = {} data["Enabled"] = QtBind.isChecked(gui,cbxEnabled) data["SelectChar"] = QtBind.isChecked(gui,cbxSelectChar) data["SelectChar2"] = QtBind.isChecked(gui,cbxSelectChar2) data["SelectChar3"] = QtBind.isChecked(gui,cbxSelectChar3) data["CreateChar"] = QtBind.isChecked(gui,cbxCreateChar) data["DeleteChar"] = QtBind.isChecked(gui,cbxDeleteChar) data["SelectCharOnAcademy"] = QtBind.isChecked(gui,cbxSelectCharOnAcademy) data["Nickname"] = QtBind.text(gui,tbxNickname) sequence = QtBind.text(gui,tbxSequence) if sequence.isnumeric(): data["Sequence"] = sequence else: data["Sequence"] = str(SEQUENCE_DEFAULT_NUMBER) QtBind.setText(gui,tbxSequence,data["Sequence"]) data["Race"] = QtBind.text(gui,cmbxRace) data["CMD"] = QtBind.text(gui,tbxCMD) data["NotificationFull"] = QtBind.isChecked(gui,cbxNotification_Full) data["SoundFull"] = QtBind.isChecked(gui,cbxSound_Full) data["SoundFullPath"] = QtBind.text(gui,tbxSound_Full) data["LogFull"] = QtBind.isChecked(gui,cbxLog_Full) data["Exit"] = QtBind.isChecked(gui,cbxExit) with open(getConfig(fileName),"w") as f: f.write(json.dumps(data,indent=4,sort_keys=True)) def btnSaveConfig_clicked(): strConfigName = QtBind.text(gui,tbxProfileName) saveConfigs(strConfigName) if strConfigName: log('Eklenti: Profil ['+strConfigName+'] Yapılandırması Kaydedildi.') else: log("Eklenti: Yapılandırmalar Kaydedildi.") def btnLoadConfig_clicked(): strConfigName = QtBind.text(gui,tbxProfileName) if loadConfigs(strConfigName): if strConfigName: log("Eklenti: Profil ["+strConfigName+"] Yapılandırması Yüklendi.") else: log("Eklenti: Yapılandırmalar Yüklendi.") elif strConfigName: log("Eklenti: Profil ["+strConfigName+"] Bulunamadı.") def CreateCharacter(): race = QtBind.text(gui,cmbxRace) if race != 'EU': race = 'CH' model = get_monster_string('CHAR_CH_MAN_ADVENTURER') chest = get_item_string('ITEM_CH_M_CLOTHES_01_BA_A_DEF') legs = get_item_string('ITEM_CH_M_CLOTHES_01_LA_A_DEF') shoes = get_item_string('ITEM_CH_M_CLOTHES_01_FA_A_DEF') weapon = get_item_string('ITEM_CH_SWORD_01_A_DEF') else: race = 'EU' model = get_monster_string('CHAR_EU_MAN_NOBLE') chest = get_item_string('ITEM_EU_M_CLOTHES_01_BA_A_DEF') legs = get_item_string('ITEM_EU_M_CLOTHES_01_LA_A_DEF') shoes = get_item_string('ITEM_EU_M_CLOTHES_01_FA_A_DEF') weapon = get_item_string('ITEM_EU_TSTAFF_01_A_DEF') if not model or not chest or not legs or not shoes or not weapon: log('Eklenti: Hata, Bu Sunucuda Eşya Kodlar Farklı.') return global isCreatingCharacter isCreatingCharacter = True log('Eklenti: Karakter Oluşturuluyor.. ['+CreatingNickname+'] ('+race+')') p = b'\x01' p += struct.pack(' 4 : maxWidth = 4 numbers = pow(10,maxWidth)-1 name = str(name)+(str(random.randint(0,numbers))).zfill(maxWidth) return name def GetSequence(): sequence = QtBind.text(gui,tbxSequence) if sequence.isnumeric(): sequence = int(sequence) else: sequence = SEQUENCE_DEFAULT_NUMBER QtBind.setText(gui,tbxSequence,str(sequence+1)) saveConfigs(QtBind.text(gui,tbxProfileName)) return sequence def GetNickSequence(nickname): seq = str(GetSequence()) nick = nickname+seq nickLength = len(nick) if nickLength > 12: nickLength -= 12 nick = nickname[:-nickLength]+seq return nick def createNickname(): global CreatingNickname customName = QtBind.text(gui,tbxNickname) if customName: CreatingNickname = GetNickSequence(customName) else: CreatingNickname = GetRandomNick() log("Eklenti: Karakter Adı Kontrol Ediliyor... ["+CreatingNickname+"]") Inject_CheckName(CreatingNickname) def KillBot(): log("Eklenti: Bot Kapatılıyor...") os.kill(os.getpid(),9) def RestartBotWithCommandLine(): global isRestarted if isRestarted: return isRestarted = True cmd = ' '.join(get_command_line_args()) subprocess.Popen(cmd) log("Eklenti: Bot 5 Saniye Içinde Kapanıyor..") Timer(5.0,KillBot).start() def handle_joymax(opcode,data): if opcode == 0xB007 and QtBind.isChecked(gui,cbxEnabled): locale = get_locale() try: global isCreatingCharacter, isDeletingCharacter index = 0 # cursor action = data[index] index+=1 success = data[index] index+=1 if action == 1: if isCreatingCharacter: isCreatingCharacter = False if success == 1: log("Eklenti: Karakter Başarıyla Oluşturuldu!") else: log("Eklenti: Karakter Oluşturma Başarısız Oldu!") elif action == 3: if isDeletingCharacter: isDeletingCharacter = False if success == 1: log("Eklenti: Karakter Başarıyla Silindi!") else: log("Eklenti: Karakter Silme Işlemi Başarısız Oldu!") elif action == 4: if isCreatingCharacter: if success == 1: log("Eklenti: Karakter Adı Mevcut!") CreateCharacter() else: log("Eklenti: Karakter Adı Zaten Alınmış!") Timer(1.0,createNickname).start() elif action == 2: if success == 1: charList = [] nChars = data[index] index+=1 log("Eklenti: TR_Academy Karakter Listesi: "+ ("None" if not nChars else "")) for i in range(nChars): character = {} character['model_id'] = struct.unpack_from('= 40 and charLevel <= 50 and charAcademyType != 0: if QtBind.isChecked(gui,cbxSelectCharOnAcademy): log("Eklenti: Karakter Seçildi ["+charName+"] (Hala Akademide)") select_character(charName) return if charLevel >= 40 and charLevel <= 50: if QtBind.isChecked(gui,cbxDeleteChar): global isDeletingCharacter isDeletingCharacter = True log("Eklenti: Karakter Silindi. ["+charName+"] (Seviye 40 ile 50 Arasında)") Inject_DeleteCharacter(charName) Timer(3.0,Inject_RequestCharacterList).start() return if charLevel < 40: if QtBind.isChecked(gui,cbxSelectChar): log("Eklenti: Karakter Seçildi ["+charName+"] (Seviye 40ın Altında)") select_character(charName) return if charLevel < 29: if QtBind.isChecked(gui,cbxSelectChar2): log("Eklenti: Karakter Seçildi ["+charName+"] (Seviye 29ın Altında)") select_character(charName) return if charLevel < 20: if QtBind.isChecked(gui,cbxSelectChar3): log("Eklenti: Karakter Seçildi ["+charName+"] (Seviye 20ın Altında)") select_character(charName) return if len(CharList) < 4: if QtBind.isChecked(gui,cbxCreateChar): global isCreatingCharacter isCreatingCharacter = True Timer(3.0,createNickname).start() else: errMessage = "Eklenti: Yeni Karakter Oluşturmak için Yeterli Alan Yok!" log(errMessage) cmd = QtBind.text(gui,tbxCMD) if cmd: log("Eklenti: Komutu Çalıştırmaya Çalışıyorum ["+cmd+"]") subprocess.Popen(cmd) if QtBind.isChecked(gui,cbxNotification_Full): show_notification(name+' v'+version,errMessage) if QtBind.isChecked(gui,cbxSound_Full): try: path = QtBind.text(gui,tbxSound_Full) play_wav(path if path else NOTIFICATION_SOUND_PATH) except: pass if QtBind.isChecked(gui,cbxLog_Full): from datetime import datetime logText = datetime.now().strftime('%m/%d/%Y - %H:%M:%S')+': '+errMessage profileName = QtBind.text(gui,tbxProfileName) logText += '\nKullanılan Profil: '+ (profileName if profileName else 'None') with open(getPath()+'_log.txt','a') as f: f.write(logText) if QtBind.isChecked(gui,cbxExit): log("Eklenti: Botunuz 5 Saniye Içinde Kapanacaktır..") Timer(5.0,KillBot).start() if os.path.exists(getPath()): useDefaultConfig = True bot_args = get_command_line_args() if bot_args: for i in range(len(bot_args)): param = bot_args[i].lower() if param.startswith('-xacademy-config='): configName = param[17:] if loadConfigs(configName): log("Eklenti: "+name+" Profil ["+configName+"] Komut Satırından Yüklendi.") useDefaultConfig = False else: log("Eklenti: "+name+" Profil ["+configName+"] Bulunamıyor.") break if useDefaultConfig: loadConfigs() else: loadDefaultConfig() os.makedirs(getPath()) log('Eklenti :%s Klasoru Olusturuldu.' % (name)) def CheckForUpdate(): global NewestVersion if NewestVersion == 0: try: req = urllib.request.Request('https://raw.githubusercontent.com/hakankahya48/EklentiTRSRO/main/TR_Academy.py', headers={'User-Agent': 'Mozilla/5.0'}) with urllib.request.urlopen(req) as f: lines = str(f.read().decode("utf-8")).split() for num, line in enumerate(lines): if line == 'version': NewestVersion = int(lines[num+2].replace(".","")) CurrentVersion = int(str(version).replace(".","")) if NewestVersion > CurrentVersion: log('Eklenti: Yeni bir güncelleme var = [%s]!' % name) lblUpdate = QtBind.createLabel(gui,'Yeni Bir Güncelleme Mevcut. Yüklemek için Tıkla ->',100,283) button1 = QtBind.createButton(gui, 'button_update', ' Güncelle ', 350, 280) except: pass def button_update(): path = get_config_dir()[:-7] if os.path.exists(path + "Plugins/" + "TR_Academy.py"): try: os.rename(path + "Plugins/" + "TR_Academy.py", path + "Plugins/" + "TR_AcademyBACKUP.py") req = urllib.request.Request('https://raw.githubusercontent.com/hakankahya48/EklentiTRSRO/main/TR_Academy.py', headers={'User-Agent': 'Mozilla/5.0'}) with urllib.request.urlopen(req) as f: lines = str(f.read().decode("utf-8")) with open(path + "Plugins/" + "TR_Academy.py", "w+") as f: f.write(lines) os.remove(path + "Plugins/" + "TR_AcademyBACKUP.py") log('Eklenti Başarıyla Güncellendi, Kullanmak için Eklentiyi Yeniden Yükleyin.') except Exception as ex: log('Güncelleme Hatası [%s] Lütfen Manuel Olarak Güncelleyin veya daha Sonra Tekrar Deneyin.' %ex) CheckForUpdate() log('Eklenti:%s v%s Yuklendi. // edit by hakankahya' % (name,version))