def getLinkInfo(self, urls): domains = "/".join(urls) url = "http://api.mywot.com/0.4/public_link_json2?hosts=%s/&key=%s" % (domains,self.wot_api_key) ts3lib.logMessage('Requesting %s'%url, ts3defines.LogLevel.LogLevel_ERROR, "PyTSon Linkinfo Script", 0) self.nwm = QNetworkAccessManager() self.nwm.connect("finished(QNetworkReply*)", self.onWOTReply) self.nwm.get(QNetworkRequest(QUrl(url)))
def __init__(self): self.nwmc = QNetworkAccessManager() self.requestVersions() if self.debug: ts3.printMessageToCurrentTab( "{0}[color=orange]{1}[/color] Plugin for pyTSon by [url=https://github.com/{2}]{2}[/url] loaded." .format(self.timestamp(), self.name, self.author))
def requestServers(self, url): if self.serverBrowser.config["GENERAL"]["debug"] == "True": self.requests += 1 ts3.printMessageToCurrentTab("Request: "+str(self.requests)) self.nwm = QNetworkAccessManager() self.nwm.connect("finished(QNetworkReply*)", self.serversReply) self.nwm.get(QNetworkRequest(QUrl(url)))
def onClientMoveEvent(self, schid, clientID, oldChannelID, newChannelID, visibility, moveMessage): if not self.toggle: return try: (error, ownid) = ts3lib.getClientID(schid) if ownid == clientID: (error, ntp) = ts3lib.getChannelVariableAsInt( schid, newChannelID, ts3defines.ChannelPropertiesRare.CHANNEL_NEEDED_TALK_POWER) if self.debug: ts3lib.printMessageToCurrentTab( 'error: {0} | ntp: {1}'.format(error, ntp)) if ntp < 1: return (error, tp) = ts3lib.getClientVariableAsInt( schid, ownid, ts3defines.ClientPropertiesRare.CLIENT_IS_TALKER) if self.debug: ts3lib.printMessageToCurrentTab( 'error: {0} | tp: {1}'.format(error, tp)) if tp: return self.nwmc = QNetworkAccessManager() self.nwmc.connect("finished(QNetworkReply*)", self.jokeReply) self.schid = schid self.nwmc.get( QNetworkRequest( QUrl("http://tambal.azurewebsites.net/joke/random"))) except: from traceback import format_exc ts3lib.logMessage(format_exc(), ts3defines.LogLevel.LogLevel_ERROR, "pyTSon", 0)
def setup(self, script, schid, clid, uid, name, ip, mytsid, hwid, servertype): self.setWindowTitle("Ban \"{}\" ({})".format(name, clid)) self.clid = clid if not ip: (err, ip) = ts3lib.getConnectionVariable( schid, clid, ts3defines.ConnectionProperties.CONNECTION_CLIENT_IP) url = script.cfg.get("general", "ipapi") if url: self.nwmc_ip = QNetworkAccessManager() self.nwmc_ip.connect("finished(QNetworkReply*)", self.checkIP) self.countries = CountryFlags() self.countries.open() self.disableISP() self.grp_ip.setChecked(script.cfg.getboolean("last", "ip")) if ip != "None": self.txt_ip.setText(ip) self.on_txt_ip_textChanged(ip) self.grp_name.setChecked(script.cfg.getboolean("last", "name")) self.txt_name.setText(name) self.on_txt_name_textChanged(name) self.grp_uid.setChecked(script.cfg.getboolean("last", "uid")) self.txt_uid.setText(uid) self.on_txt_uid_textChanged(uid) self.grp_mytsid.setChecked(script.cfg.getboolean("last", "mytsid")) self.txt_mytsid.setText(mytsid) self.on_txt_mytsid_textChanged(mytsid) if servertype == ServerInstanceType.TEASPEAK: self.grp_hwid.setChecked(script.cfg.getboolean("last", "hwid")) self.txt_hwid.setText(hwid) self.on_txt_hwid_textChanged(hwid) else: self.grp_hwid.setVisible(False) self.setDuration(script.cfg.getint("last", "duration"))
def requestBadgesExt(self): try: with open(self.badges_ext, encoding='utf-8-sig') as json_file: self.extbadges = load(json_file) except: self.nwmc_ext = QNetworkAccessManager() self.nwmc_ext.connect("finished(QNetworkReply*)", self.loadBadgesExt) self.nwmc_ext.get(QNetworkRequest(QUrl(self.badges_ext_remote)))
class InstallDialog(QDialog, pytson.Translatable): def __init__(self, host, parent=None): super(QDialog, self).__init__(parent) self.setAttribute(Qt.WA_DeleteOnClose) self.setModal(True) self.host = host self.addon = None try: setupUi(self, pytson.getPluginPath("ressources", "installer.ui")) self.pip = devtools.PluginInstaller(self.consoleEdit.append) self.nwm = QNetworkAccessManager(self) self.nwm.connect("finished(QNetworkReply*)", self.onNetworkReply) self.closeFrame.hide() except Exception as e: self.delete() raise e def install(self, addon): self.addon = addon req = QNetworkRequest(QUrl(addon["url"])) req.setAttribute(QNetworkRequest.FollowRedirectsAttribute, True) self.nwm.get(req) self.consoleEdit.append("Downloading %s ..." % addon["url"]) def installPackage(self, pkgstr): self.pip.installPackages([pkgstr]) self.closeFrame.show() def onNetworkReply(self, reply): if reply.error() == QNetworkReply.NoError: self.consoleEdit.append("Download finished.") try: if ("application/zip" not in reply.header(QNetworkRequest.ContentTypeHeader)): self.pip.installPlugin(self.addon, reply.readAll().data(). decode('utf-8')) else: self.pip.installPlugin(self.addon, io.BytesIO(reply.readAll().data())) except Exception as e: self.consoleEdit.append("Exception during installation: %s" % e) else: self.consoleEdit.append("Network error: %s" % reply.error()) reply.deleteLater() self.closeFrame.show() def on_closeButton_clicked(self): self.accept()
def commandDoxx(self, schid, targetMode, toID, fromID, params=""): try: from PythonQt.QtNetwork import QNetworkAccessManager, QNetworkRequest url = "https://randomuser.me/api/?gender={0}&nat=de&noinfo".format(params.split(" ")[1]) if self.cfg.getboolean("general", "debug"): ts3lib.printMessageToCurrentTab("Requesting: {0}".format(url)) self.nwmc = QNetworkAccessManager() self.nwmc.connect("finished(QNetworkReply*)", self.doxxReply) self.cmdevent = {"event": "", "returnCode": "", "schid": schid, "targetMode": targetMode, "toID": toID, "fromID": fromID, "params": params} self.nwmc.get(QNetworkRequest(QUrl(url))) except: from traceback import format_exc;ts3lib.logMessage(format_exc(), ts3defines.LogLevel.LogLevel_ERROR, "pyTSon", 0)
def getLinkInfo(self, urls): # https://www.mywot.com/wiki/API links = "/".join(urls) ts3lib.printMessageToCurrentTab("%s" % links) url = "http://api.mywot.com/0.4/public_link_json2?hosts=%s&key=%s" % ( links, self.wotapikey) ts3.logMessage('Requesting %s' % url, ts3defines.LogLevel.LogLevel_ERROR, "PyTSon Linkinfo Script", 0) self.nwm = QNetworkAccessManager() self.nwm.connect("finished(QNetworkReply*)", self.onNetworkReply) self.nwm.get(QNetworkRequest(QUrl(url)))
def requestCountries(self): self.nwmc = QNetworkAccessManager() self.nwmc.connect("finished(QNetworkReply*)", self.onCountryListReply) self.nwmc.get( QNetworkRequest( QUrl(self.serverBrowser.config['GENERAL']['api'] + "servercountries"))) if self.serverBrowser.config["GENERAL"]["debug"] == "True": ts3.printMessageToCurrentTab( "requestCountries: " + self.serverBrowser.config['GENERAL']['api'] + "servercountries")
def __init__(self): loadCfg(self.ini, self.cfg) url = self.cfg.get("general", "template") if url: self.nwmc_template = QNetworkAccessManager() self.nwmc_template.connect("finished(QNetworkReply*)", self.loadTemplates) self.nwmc_template.get(QNetworkRequest(QUrl(url))) url = self.cfg.get("general", "whitelist") if url: self.nwmc_whitelist = QNetworkAccessManager() self.nwmc_whitelist.connect("finished(QNetworkReply*)", self.loadWhitelist) self.nwmc_whitelist.get(QNetworkRequest(QUrl(url))) if PluginHost.cfg.getboolean("general", "verbose"): ts3lib.printMessageToCurrentTab("{0}[color=orange]{1}[/color] Plugin for pyTSon by [url=https://github.com/{2}]{2}[/url] loaded.".format(timestamp(),self.name,self.author))
def commandGoogle(self, schid, targetMode, toID, fromID, params=""): try: from PythonQt.QtNetwork import QNetworkAccessManager, QNetworkRequest from urllib.parse import quote_plus googleAPI = "https://www.googleapis.com/customsearch/v1" googleAPIKey = "AIzaSyDj5tgIBtdiL8pdVV_tqm7aw45jjdFP1hw" googleSearchID = "008729515406769090877:33fok_ycoaa" params = quote_plus(params) url = "{0}?key={1}&cx={2}&q={3}".format(googleAPI, googleAPIKey, googleSearchID, params) self.nwmc = QNetworkAccessManager() self.nwmc.connect("finished(QNetworkReply*)", self.googleReply) self.cmdevent = {"event": "", "returnCode": "", "schid": schid, "targetMode": targetMode, "toID": toID, "fromID": fromID, "params": params} self.nwmc.get(QNetworkRequest(QUrl(url))) except: from traceback import format_exc;ts3lib.logMessage(format_exc(), ts3defines.LogLevel.LogLevel_ERROR, "pyTSon", 0)
def commandLookup(self, schid, targetMode, toID, fromID, params=""): try: from PythonQt.QtNetwork import QNetworkAccessManager, QNetworkRequest from urllib.parse import quote_plus lookupAPI = "https://api.opencnam.com/v3/phone/" lookupSID = "ACda22b69608b743328772059d32b63f26" lookupAuthToken = "AUc9d9217f20194053bf2989c7cb75a368" if params.startswith("00"): params = params.replace("00", "+", 1) params = quote_plus(params) url = "{0}{1}?format=json&casing=title&service_level=plus&geo=rate&account_sid={2}&auth_token={3}".format(lookupAPI, params, lookupSID, lookupAuthToken) if self.cfg.getboolean("general", "debug"): ts3lib.printMessageToCurrentTab("Requesting: {0}".format(url)) self.nwmc = QNetworkAccessManager() self.nwmc.connect("finished(QNetworkReply*)", self.lookupReply) self.cmdevent = {"event": "", "returnCode": "", "schid": schid, "targetMode": targetMode, "toID": toID, "fromID": fromID, "params": params} self.nwmc.get(QNetworkRequest(QUrl(url))) except: from traceback import format_exc;ts3lib.logMessage(format_exc(), ts3defines.LogLevel.LogLevel_ERROR, "pyTSon", 0)
class network(object): nwmc = QNetworkAccessManager() def getFile(self, url): """ :param url: """ self.nwmc.connect("finished(QNetworkReply*)", self._getFileReply) self.nwmc.get(QNetworkRequest(QUrl(url))) def _getFileReply(self, reply): del self.nwmc def downloadFile(self, url, path): """ :param url: :param path: """ self.nwmc.connect("finished(QNetworkReply*)", self._downloadFileReply) dlpath = path self.nwmc.get(QNetworkRequest(QUrl(url))) def _downloadFileReply(self, reply): del self.nwmc """
def urlAvatar(self, schid): try: self.nwm = QNetworkAccessManager() self.nwm.connect("finished(QNetworkReply*)", self.onNetworkReply) self.schid = schid print("%s" % self.config.get('GENERAL', 'imgurl')) self.nwm.get( QNetworkRequest(QUrl(self.config.get('GENERAL', 'imgurl')))) except: from traceback import format_exc try: ts3lib.logMessage(format_exc(), ts3defines.LogLevel.LogLevel_ERROR, "PyTSon Script", 0) except: print(format_exc())
def updateCheck(cls): if cls.nwm: # there is a pending updatecheck return cls.nwm = QNetworkAccessManager() cls.nwm.connect("finished(QNetworkReply*)", cls.updateCheckFinished) cls.nwm.get(QNetworkRequest(REL_URL))
def commandWhois(self, schid, targetMode, toID, fromID, params=""): try: from PythonQt.QtNetwork import QNetworkAccessManager, QNetworkRequest from urllib.parse import quote_plus params = quote_plus(params) url = "https://jsonwhois.com/api/v1/whois?domain={0}".format(params) token = "fe1abe2646bdc7fac3d36a688d1685fc" if self.cfg.getboolean("general", "debug"): ts3lib.printMessageToCurrentTab("Requesting: {0}".format(url)) request = QNetworkRequest() request.setHeader( QNetworkRequest.ContentTypeHeader, "application/json" ); request.setRawHeader("Authorization", "Token token={0}".format(token)); request.setUrl(QUrl(url)) self.nwmc = QNetworkAccessManager() self.nwmc.connect("finished(QNetworkReply*)", self.whoisReply) self.cmdevent = {"event": "", "returnCode": "", "schid": schid, "targetMode": targetMode, "toID": toID, "fromID": fromID, "params": params} self.nwmc.get(request) except: from traceback import format_exc;ts3lib.logMessage(format_exc(), ts3defines.LogLevel.LogLevel_ERROR, "pyTSon", 0)
def __init__(self): loadCfg(self.ini, self.cfg) try: with open(self.badgesinfo, encoding='utf-8-sig') as json_file: self.badges = load(json_file) except: self.nwmc = QNetworkAccessManager() self.nwmc.connect("finished(QNetworkReply*)", self.loadBadges) self.nwmc.get( QNetworkRequest( QUrl( "https://gist.githubusercontent.com/Bluscream/29b838f11adc409feac9874267b43b1e/raw" ))) if self.cfg.getboolean("general", "debug"): ts3lib.printMessageToCurrentTab( "{0}[color=orange]{1}[/color] Plugin for pyTSon by [url=https://github.com/{2}]{2}[/url] loaded." .format(timestamp(), self.name, self.author))
def setup(self, script, schid, clid, uid, name, ip): self.setWindowTitle("Ban \"{}\" ({})".format(name, clid)) self.clid = clid url = script.cfg.getboolean("general", "ipapi") if url: self.nwmc_ip = QNetworkAccessManager() self.nwmc_ip.connect("finished(QNetworkReply*)", self.checkIP) self.countries = CountryFlags() self.countries.open() self.disableISP() self.grp_ip.setChecked(script.cfg.getboolean("last", "ip")) if ip: self.txt_ip.setText(ip) self.grp_name.setChecked(script.cfg.getboolean("last", "name")) if name: self.txt_name.setText(name) self.grp_uid.setChecked(script.cfg.getboolean("last", "uid")) if uid: self.txt_uid.setText(uid) self.int_duration.setValue(script.cfg.getint("last", "duration"))
def __init__(self, host, parent=None): super(QDialog, self).__init__(parent) self.setAttribute(Qt.WA_DeleteOnClose) self.setModal(True) self.host = host self.addon = None try: setupUi(self, pytson.getPluginPath("ressources", "installer.ui")) self.pip = devtools.PluginInstaller(self.consoleEdit.append) self.nwm = QNetworkAccessManager(self) self.nwm.connect("finished(QNetworkReply*)", self.onNetworkReply) self.closeFrame.hide() except Exception as e: self.delete() raise e
class testplugin(ts3plugin): name = "Link Steam" requestAutoload = False version = "1" apiVersion = 21 author = "OhanesianAndreiLaurentiu" description = "Link Steam, add a feature in teamspeak 3 where you can click a steam link and is open in your steam client instead of your default browser." offersConfigure = False commandKeyword = "" infoTitle = "" menuItems = [] hotkeys = [] domains = ["steamcommunity.com", "store.steampowered.com"] updateurl = "https://raw.githubusercontent.com/oandreilaurentiu/linksteam/master/version.json" repourl = "https://github.com/{}/{}/releases".format(author, name) def __init__(self): ts3lib.printMessageToCurrentTab("Steamlinker " + self.version + " loaded") self.nwmc = QNetworkAccessManager() self.nwmc.connect("finished(QNetworkReply*)", self.updateReply) self.nwmc.get(QNetworkRequest(QUrl(self.updateurl))) def updateReply(self, reply): version = loads(reply.readAll().data().decode('utf-8'))["version"] if version != self.version: x = QDialog() x.setAttribute(Qt.WA_DeleteOnClose) _x = QMessageBox.question( x, "{} v{} by {}".format(self.name, self.version, self.author), "Noua versiune v{} la linksteam a fost gasita, dai update acum?" .format(version), QMessageBox.Yes, QMessageBox.No) if _x == QMessageBox.Yes: QDesktopServices.openUrl(QUrl(self.repourl)) def onTextMessageEvent(self, schid, targetMode, toID, fromID, fromName, fromUniqueIdentifier, message, ffIgnored): for url in self.domains: if url in message: ts3lib.printMessageToCurrentTab("[URL=steam://openurl/" + message[5:-6] + "]Open in Steam.[/URL]") return
def requestExtIcon(self, filename): self.nwmc_exti[filename] = QNetworkAccessManager() self.nwmc_exti[filename].connect("finished(QNetworkReply*)", self.loadExtIcon) self.tmpfile[filename] = QFile() self.tmpfile[filename].setFileName(path.join(self.icons, filename)) self.tmpfile[filename].open(QIODevice.WriteOnly) url = "https://raw.githubusercontent.com/R4P3-NET/CustomBadges/master/img/{}".format( filename) self.nwmc_exti[filename].get(QNetworkRequest(QUrl(url)))
def onConnectionInfoEvent(self, schid, clientID): if not self.requested == clientID: return (error, ip) = ts3lib.getConnectionVariableAsString( schid, clientID, ts3defines.ConnectionProperties.CONNECTION_CLIENT_IP) if error == ts3defines.ERROR_ok: self.ip = ip self.nwm = QNetworkAccessManager() self.nwm.connect("finished(QNetworkReply*)", self.onMainReply) self.nwm.get( QNetworkRequest( QUrl(self.cfg['api']['main'].replace("{ip}", ip)))) if PluginHost.cfg.getboolean("general", "verbose"): ts3lib.printMessageToCurrentTab( self.cfg['api']['main'].replace("{ip}", ip)) else: (e, msg) = ts3lib.getErrorMessage(error) ts3lib.printMessageToCurrentTab( "[[color=orange]WARNING[/color]] [color=red]ISPValidator could not resolve the IP for '%s' (Reason: %s)" % (clientURL(schid, clientID), msg))
def __init__(self, host, parent=None): super(QDialog, self).__init__(parent) self.setAttribute(Qt.WA_DeleteOnClose) self.host = host self.pending = 0 try: with open(pytson.getConfigPath("repositorymaster.json"), "r") as f: repmaster = json.loads(f.read()) self.replist = {x["name"]: x for x in repmaster} except: ts3print(self._tr("Error opening repositorymaster"), ts3defines.LogLevel.LogLevel_ERROR, "pyTSon.RepositoryDialog", 0) raise Exception("Error opening repositorymaster") try: setupUi(self, pytson.getPluginPath("ressources", "repository.ui")) self.updateMasterlist() movie = QMovie(pytson.getPluginPath("ressources", "loading.gif"), "", self) movie.start() self.loadingLabel.setMovie(movie) self.masterloadingLabel.setMovie(movie) self.masterloadingLabel.hide() self.nwm = QNetworkAccessManager(self) self.nwm.connect("finished(QNetworkReply*)", self.onNetworkReply) self.updateRepositories() self.connect("finished(int)", self.onClosed) except Exception as e: self.delete() raise e
def onClientMoveEvent(self, schid, clientID, oldChannelID, newChannelID, visibility, moveMessage): if not self.toggle or schid != self.schid: return (error, ownid) = ts3lib.getClientID(schid) if ownid != clientID: return if not self.talker(): if self.toggle == 1: if self.msg != "": self.nwmc = QNetworkAccessManager() self.nwmc.connect("finished(QNetworkReply*)", self.jokeReply) self.nwmc.get( QNetworkRequest( QUrl("http://tambal.azurewebsites.net/joke/random") )) else: ts3lib.requestIsTalker(schid, True, self.msg) elif self.toggle == 2: self.active = True else: if self.toggle == 2: self.active = False
def getFile(url): """ :param url: """ nwmc = QNetworkAccessManager() nwmc.connect("finished(QNetworkReply*)", _getFileReply) nwmc.get(QNetworkRequest(QUrl(url)))
def downloadFile(url, path): """ :param url: :param path: """ nwmc = QNetworkAccessManager() nwmc.connect("finished(QNetworkReply*)", _downloadFileReply) dlpath = path nwmc.get(QNetworkRequest(QUrl(url)))
def url(url): try: from PythonQt.QtNetwork import QNetworkAccessManager, QNetworkRequest #if urlrequest: return urlrequest = QNetworkAccessManager() urlrequest.connect("finished(QNetworkReply*)", urlResponse) urlrequest.get(QNetworkRequest(QUrl(url))) except: from traceback import format_exc try: ts3lib.logMessage(format_exc(), ts3defines.LogLevel.LogLevel_ERROR, "PyTSon::autorun", 0) except: print("Error in autorun: "+format_exc())
def getFile(url): nwmc = QNetworkAccessManager() nwmc.connect("finished(QNetworkReply*)", getFile) nwmc.get(QNetworkRequest(QUrl(url)))
class RepositoryDialog(QDialog, pytson.Translatable): master_url = QUrl("https://raw.githubusercontent.com/pathmann/pyTSon_repository/master/repositorymaster.json") def __init__(self, host, parent=None): super(QDialog, self).__init__(parent) self.setAttribute(Qt.WA_DeleteOnClose) self.host = host self.pending = 0 try: with open(pytson.getConfigPath("repositorymaster.json"), "r") as f: repmaster = json.loads(f.read()) self.replist = {x["name"]: x for x in repmaster} except: ts3print(self._tr("Error opening repositorymaster"), ts3defines.LogLevel.LogLevel_ERROR, "pyTSon.RepositoryDialog", 0) raise Exception("Error opening repositorymaster") try: setupUi(self, pytson.getPluginPath("ressources", "repository.ui")) self.updateMasterlist() movie = QMovie(pytson.getPluginPath("ressources", "loading.gif"), "", self) movie.start() self.loadingLabel.setMovie(movie) self.masterloadingLabel.setMovie(movie) self.masterloadingLabel.hide() self.nwm = QNetworkAccessManager(self) self.nwm.connect("finished(QNetworkReply*)", self.onNetworkReply) self.updateRepositories() self.connect("finished(int)", self.onClosed) except Exception as e: self.delete() raise e def onClosed(self): with open(pytson.getConfigPath("repositorymaster.json"), "w") as f: json.dump(list(self.replist.values()), f) def updatePendingButtons(self): if self.pending == 0: self.reloadButton.setEnabled(True) self.updateButton.setEnabled(True) self.loadingLabel.hide() self.masterloadingLabel.hide() else: self.reloadButton.setEnabled(False) self.updateButton.setEnabled(False) self.loadingLabel.show() self.masterloadingLabel.show() def updateRepositories(self): self.addons = {} self.pluginsList.clear() self.pending += sum(x["active"] for x in self.replist.values()) for rep in self.replist.values(): if all(x in rep for x in ['name', 'url', 'origin', 'active']): if rep["active"]: self.nwm.get(QNetworkRequest(QUrl(rep["url"]))) else: self.pending -= 1 ts3print(self._tr("Invalid repository in list, ignoring"), ts3defines.LogLevel.LogLevel_WARNING, "pyTSon.RepositoryDialog.updateRepositories", 0) self.updatePendingButtons() def updateMaster(self): self.pending += 1 self.masterloadingLabel.show() self.updateButton.setEnabled(False) self.nwm.get(QNetworkRequest(self.master_url)) self.updatePendingButtons() def handleMasterReply(self, reply): if reply.error() == QNetworkReply.NoError: try: repos = json.loads(reply.readAll().data().decode('utf-8')) for r in repos: if all(x in r for x in ["name", "url", "active", "origin"]): self.addRepository(r) else: ts3print(self._tr("Invalid entry in repositorymaster"), ts3defines.LogLevel.LogLevel_WARNING, "pyTSon.RepositoryManager.onNetworkReply", 0) except: ts3print(self._tr("Error reading repositorymaster: {trace}"). format(trace=traceback.format_exc()), ts3defines.LogLevel.LogLevel_ERROR, "pyTSon.RepositoryManager.onNetworkReply", 0) self.updateMasterlist() def updateAddons(self, repo, addons): for a in addons: if all(x in a for x in ["name", "author", "version", "apiVersion", "description", "url"]): a["repository"] = repo["name"] if not a["name"] in self.addons: self.addons[a["name"]] = a else: ts3print(self._tr("Invalid entry in repository {name}: " "{repo}").format(name=repo["name"], repo=str(a)), ts3defines.LogLevel.LogLevel_WARNING, "pyTSon.RepositoryDialog.onNetworkReply", 0) break def handleRepositoryReply(self, reply): repo = None for r in self.replist.values(): if reply.url().url() == r["url"]: repo = r break if not repo: ts3print(self._tr("Error matching answer from {url} to a " "repository").format(url=reply.url().url()), ts3defines.LogLevel.LogLevel_ERROR, "pyTSon.RepositoryDialog.onNetworkReply", 0) elif reply.error() == QNetworkReply.NoError: try: self.updateAddons(repo, json.loads(reply.readAll().data() .decode('utf-8'))) except ValueError as e: ts3print(self._tr("Error parsing repository {name}: " "{exception}").format(name=repo["name"], exception=str(e)), ts3defines.LogLevel.LogLevel_WARNING, "pyTSon.RepositoryDialog.onNetworkReply", 0) else: ts3print(self._tr("Network error updating repository {name}: " "{error}").format(name=repo["name"], error=reply.error()), ts3defines.LogLevel.LogLevel_WARNING, "pyTSon.RepositoryDialog.onNetworkReply", 0) if self.pending == 0: self.updateAddonlist() def onNetworkReply(self, reply): self.pending -= 1 if reply.url() == self.master_url: self.handleMasterReply(reply) else: self.handleRepositoryReply(reply) reply.deleteLater() self.updatePendingButtons() def addRepository(self, r): name = r["name"] if name in self.replist: if self.replist[name]["origin"] == "online": if self.replist[name]["url"] != r["url"]: self.replist[name]["url"] = r["url"] ts3print(self._tr("Url for repository {name} updated"). format(name=name), ts3defines.LogLevel.LogLevel_INFO, "pyTSon.RepositoryManager.addRepository", 0) else: ts3print(self._tr("Ignoring online repository {name}, got a " "local one with that name"). format(name=name), ts3defines.LogLevel.LogLevel_INFO, "pyTSon.RepositoryManager.addRepository", 0) else: self.replist[name] = r def updateMasterlist(self): self.repositoryList.clear() for name, r in self.replist.items(): item = QListWidgetItem(name) item.setFlags(Qt.ItemIsSelectable | Qt.ItemIsUserCheckable | Qt.ItemIsEnabled) item.setCheckState(Qt.Checked if r["active"] else Qt.Unchecked) item.setData(Qt.UserRole, name) self.repositoryList.addItem(item) def updateAddonlist(self): if self.pluginsList.currentItem(): cur = self.pluginsList.currentItem().text() else: cur = None self.pluginsList.clear() for a in self.addons.values(): if (self.replist[a["repository"]]["active"] and ("platforms" not in a or pytson.platformstr() in a["platforms"])): item = QListWidgetItem(a["name"], self.pluginsList) item.setFlags(Qt.ItemIsSelectable | Qt.ItemIsUserCheckable | Qt.ItemIsEnabled) item.setData(Qt.UserRole, a["name"]) if a["name"] in self.host.plugins: if a["version"] > self.host.plugins[a["name"]].version: item.setForeground(Qt.red) item.setToolTip(self._tr("Update available")) elif a["version"] == self.host.plugins[a["name"]].version: item.setForeground(Qt.green) item.setToolTip(self._tr("You have this plugin " "installed, no update " "available")) elif a["version"] < self.host.plugins[a["name"]].version: item.setForeground(Qt.gray) item.setToolTip(self._tr("Your local version has a " "greater version number")) if cur and a["name"] == cur: self.pluginsList.setCurrentItem(item) self.pluginsList.sortItems() def on_updateButton_clicked(self): self.updateMaster() def on_addButton_clicked(self): (res, name, url) = MultiInputDialog.getTexts(self._tr("Add repository"), self._tr("Name:"), self._tr("URL:"), "", "", self) if res: qurl = QUrl(url) if qurl.isValid() and not qurl.isLocalFile(): rep = dict() rep["name"] = name rep["url"] = url rep["origin"] = "local" rep["active"] = True self.replist[name] = rep item = QListWidgetItem(name) item.setFlags(Qt.ItemIsSelectable | Qt.ItemIsUserCheckable | Qt.ItemIsEnabled) item.setCheckState(Qt.Checked) item.setData(Qt.UserRole, name) self.repositoryList.addItem(item) else: QMessageBox.critical(self._tr("Error"), self._tr("The URL {url} is not valid"). format(url=url)) def on_deleteButton_clicked(self): cur = self.repositoryList.currentItem() if cur: name = cur.data(Qt.UserRole) if name not in self.replist: QMessageBox.critical(self._tr("Internal error"), self._tr("Can't find repository {name} " "in list").format(name=name)) return del self.replist[name] cur.delete() def on_repositoryList_doubleClicked(self, item): name = item.data(Qt.UserRole) try: rep = self.replist[name] except: QMessageBox.critical(self, self._tr("Internal error"), self._tr("Can't find repository {name} in " "list").format(name=name)) return ok = BoolResult() newurl = QInputDialog.getText(self, self._tr("Change url of repository " "{name}").format(name=name), self._tr("Url:"), QLineEdit.Normal, rep["url"], ok) if ok: rep["url"] = newurl rep["origin"] = "local" def on_repositoryList_currentItemChanged(self, cur, prev): if cur: name = cur.data(Qt.UserRole) if name not in self.replist: self.deleteButton.setEnabled(False) QMessageBox.critical(self, self._tr("Internal error"), self._tr("Can't find repository {name} " "in list").format(name=name)) return self.deleteButton.setEnabled(True) else: self.deleteButton.setEnabled(False) def on_repositoryList_itemChanged(self, item): if not item: return name = item.data(Qt.UserRole) if name not in self.replist: QMessageBox.critical(self, self._tr("Internal error"), self._tr("Can't find repository {name} in " "list").format(name=name)) return if self.replist[name]["active"] != (item.checkState() == Qt.Checked): self.replist[name]["active"] = (item.checkState() == Qt.Checked) self.updateAddonlist() def on_pluginsList_currentItemChanged(self, cur, prev): if cur: name = cur.data(Qt.UserRole) if name not in self.addons: QMessageBox.critical(self, self._tr("Internal error"), self._tr("Can't find addon {name} in " "list").format(name=name)) return p = self.addons[name] self.nameEdit.setText(p["name"]) self.authorEdit.setText(p["author"]) self.versionEdit.setText(p["version"]) self.descriptionEdit.setPlainText(p["description"]) self.apiEdit.setText(p["apiVersion"]) self.repositoryEdit.setText(p["repository"]) if name in self.host.plugins: if p["version"] > self.host.plugins[name].version: self.installButton.setEnabled(True) self.installButton.setText(self._tr("Update")) else: self.installButton.setEnabled(False) self.installButton.setText(self._tr("Install")) else: self.installButton.setEnabled(True) self.installButton.setText(self._tr("Install")) else: self.nameEdit.clear() self.authorEdit.clear() self.versionEdit.clear() self.descriptionEdit.clear() self.apiEdit.clear() self.repositoryEdit.clear() def on_reloadButton_clicked(self): self.updateRepositories() def on_installButton_clicked(self): item = self.pluginsList.currentItem() if not item: return name = item.data(Qt.UserRole) if name not in self.addons: QMessageBox.critical(self, self._tr("Internal error"), self._tr("Can't find addon {name} in list"). format(name=name)) return p = self.addons[name] # update?, so remove the local one first if name in self.host.plugins: if p["version"] > self.host.plugins[name].version: devtools.PluginInstaller.removePlugin(name) else: # should not happen (ui restricted) QMessageBox.critical(self, self._tr("Internal error"), self._tr("This plugin is already " "installed")) return self.installer = InstallDialog(self.host, self) self.installer.show() self.installer.install(p)
class chatBot(ts3plugin): name = "Chat Bot" apiVersion = 22 requestAutoload = False version = "1.0" author = "Bluscream" description = "A simple chatbot for Teamspeak 3 Clients" offersConfigure = True commandKeyword = "" infoTitle = None menuItems = [] hotkeys = [] ini = path.join(pytson.getPluginPath(), "scripts", "chatBot", "settings.ini") cfg = ConfigParser() cmdini = path.join(pytson.getPluginPath(), "scripts", "chatBot", "commands.ini") cmd = ConfigParser() # cmdpy = path.join(pytson.getPluginPath(), "scripts", "chatBot") dlg = None color = [] cmdevent = {"event": "", "returnCode": "", "schid": 0, "targetMode": 4, "toID": 0, "fromID": 0, "params": ""} lastcmd = {"cmd": "", "params": "", "time": 0, "user": 0} returnCode = "" noperms = [] tmpsgroups = [] tmpcgroups = [] def timestamp(self): return '[{:%Y-%m-%d %H:%M:%S}] '.format(datetime.now()) def __init__(self): if path.isfile(self.ini): self.cfg.read(self.ini) else: self.cfg['general'] = {"cfgversion": "1", "debug": "False", "enabled": "True", "customprefix": "True", "prefix": "!", "unknowncmd": "True"} with open(self.ini, 'w') as configfile: self.cfg.write(configfile) if path.isfile(self.cmdini): self.cmd.read(self.cmdini) else: self.cmd['about'] = {"enabled": "True", "function": "commandAbout"} self.cmd['help'] = {"enabled": "False", "function": "commandHelp"} with open(self.cmdini, 'w') as configfile: self.cmd.write(configfile) if self.cfg.getboolean("general", "debug"): ts3lib.printMessageToCurrentTab("{0}[color=orange]{1}[/color] Plugin for pyTSon by [url=https://github.com/{2}]{2}[/url] loaded.".format(self.timestamp(), self.name, self.author)) def configure(self, qParentWidget): try: if not self.dlg: self.dlg = SettingsDialog(self.ini, self.cfg, self.cmdini, self.cmd) self.dlg.show() self.dlg.raise_() self.dlg.activateWindow() if path.isfile(self.ini): self.cfg.read(self.ini) except: from traceback import format_exc;ts3lib.logMessage(format_exc(), ts3defines.LogLevel.LogLevel_ERROR, "PyTSon") def onTextMessageEvent(self, schid, targetMode, toID, fromID, fromName, fromUniqueIdentifier, message, ffIgnored): try: if ffIgnored: return False (error, ownID) = ts3lib.getClientID(schid) lasttime = int(self.lastcmd["time"]) time = int(timestamp.time()) (error, _clid) = ts3lib.getClientID(schid) if targetMode == ts3defines.TextMessageTargetMode.TextMessageTarget_CLIENT and toID != _clid: return # if targetMode == ts3defines.TextMessageTargetMode.TextMessageTarget_CHANNEL and toID != _cid: return False # ts3lib.printMessageToCurrentTab(self.clientURL(schid, _clid)) # ts3lib.printMessageToCurrentTab(message) # ts3lib.printMessageToCurrentTab("%s"%message.startswith(self.clientURL(schid, _clid))) # ts3lib.printMessageToCurrentTab("%s"%str(self.clientURL(schid, _clid) in message.strip())) if message.startswith(self.cfg.get('general', 'prefix')) and self.cfg.getboolean('general', 'customprefix'): command = message.split(self.cfg.get('general', 'prefix'), 1)[1] elif message.startswith(self.clientURL(schid, _clid)) and not self.cfg.getboolean('general', 'customprefix'): command = message.split(self.clientURL(schid, _clid), 1)[1] else: return False if self.cfg.getboolean("general", "debug"): ts3lib.printMessageToCurrentTab("{0}".format(self.lastcmd)) ts3lib.printMessageToCurrentTab("time: {0}".format(time)) ts3lib.printMessageToCurrentTab("time -5: {0}".format(time - 5)) ts3lib.printMessageToCurrentTab("lasttime: {0}".format(lasttime)) if lasttime > time - 5: ts3lib.printMessageToCurrentTab("is time -5: True") cmd = command.split(' ', 1)[0].lower() if not cmd in self.cmd.sections(): if self.cfg.getboolean("general", "unknowncmd"): self.answerMessage(schid, targetMode, toID, fromID, "Command %s does not exist." % cmd) return False if not self.cmd.getboolean(cmd, "enabled"): if self.cfg.getboolean("general", "disabledcmd"): self.answerMessage(schid, targetMode, toID, fromID, "Command %s is disabled." % cmd) return False params = "" _params = "" try: _params = command.split(' ', 1)[1].strip() except: pass if _params != "": params = _params # ;params = bytes(_params, "utf-8").decode("unicode_escape") self.lastcmd = {"cmd": cmd, "params": params, "time": int(timestamp.time()), "user": fromID} ts3lib.printMessageToCurrentTab("{0}".format(self.lastcmd)) if targetMode == ts3defines.TextMessageTargetMode.TextMessageTarget_CHANNEL: ( error, toID) = ts3lib.getChannelOfClient(schid, _clid) evalstring = "self.%s(%s,%s,%s,%s,'%s')" % ( self.cmd.get(cmd, "function"), schid, targetMode, toID, fromID, params) eval(evalstring) except: from traceback import format_exc;ts3lib.logMessage(format_exc(), ts3defines.LogLevel.LogLevel_ERROR, "PyTSon", 0) def onConnectStatusChangeEvent(self, schid, newStatus, errorNumber): if newStatus == ts3defines.ConnectStatus.STATUS_DISCONNECTED: if schid in self.noperms: self.noperms.remove(schid) def onServerPermissionErrorEvent(self, schid, errorMessage, error, returnCode, failedPermissionID): if self.returnCode == returnCode and error == 2568 and failedPermissionID == 217: self.noperms.extend([schid]) def answerMessage(self, schid, targetMode, toID, fromID, message, hideprefix=False): if schid in self.noperms: ts3lib.printMessageToCurrentTab("Insufficient permissions to answer message from {0}".format(fromID)); return message = [message[i:i + 1024] for i in range(0, len(message), 1024)] if targetMode == ts3defines.TextMessageTargetMode.TextMessageTarget_CLIENT: for msg in message: self.returnCode = ts3lib.createReturnCode(); ts3lib.requestSendPrivateTextMsg(schid, msg, fromID, self.returnCode) elif targetMode == ts3defines.TextMessageTargetMode.TextMessageTarget_CHANNEL: if hideprefix: for msg in message: self.returnCode = ts3lib.createReturnCode(); ts3lib.requestSendChannelTextMsg(schid, "{0}".format(msg), toID, self.returnCode) else: for msg in message: self.returnCode = ts3lib.createReturnCode(); ts3lib.requestSendChannelTextMsg(schid, "[url=client://]@[/url]%s: %s" % ( self.clientURL(schid, fromID), msg), toID, self.returnCode) def clientURL(self, schid=None, clid=0, uid=None, nickname=None, encodednick=None): if schid == None: try: schid = ts3lib.getCurrentServerConnectionHandlerID() except: pass if uid == None: try: (error, uid) = ts3lib.getClientVariableAsString(schid, clid, ts3defines.ClientProperties.CLIENT_UNIQUE_IDENTIFIER) except: pass if nickname == None: try: (error, nickname) = ts3lib.getClientVariableAsString(schid, clid, ts3defines.ClientProperties.CLIENT_NICKNAME) except: nickname = uid if encodednick == None: try: encodednick = urlencode(nickname) except: pass return "[url=client://%s/%s~%s]%s[/url]" % (clid, uid, encodednick, nickname) # YOUR COMMANDS HERE: def commandAbout(self, schid, targetMode, toID, fromID, params=""): self.answerMessage(schid, targetMode, toID, fromID, "%s v%s by %s" % (self.name, self.version, self.author)) def commandHelp(self, schid, targetMode, toID, fromID, params=""): _cmds = "\n" if self.cfg.getboolean('general', 'customprefix'): prefix = self.cfg.get('general', 'prefix') else: (error, id) = ts3lib.getClientID(schid);prefix = self.clientURL(schid, id) for command in self.cmd.sections(): if self.cmd.getboolean(command, "enabled"): _cmds += prefix + str(command) + "\n" else: _cmds += prefix + str(command) + " (Disabled)\n" self.answerMessage(schid, targetMode, toID, fromID, "Available commands for %s v%s:%s" % (self.name, self.version, _cmds), True) def commandToggle(self, schid, targetMode, toID, fromID, params=""): (error, ownID) = ts3lib.getClientID(schid) if not fromID == ownID: return self.cmd.set(params, "enabled", str(not self.cmd.getboolean(params, "enabled"))) self.answerMessage(schid, targetMode, toID, fromID, "Set command {0} to {1}".format(params, self.cmd.getboolean(params, "enabled"))) def commandEval(self, schid, targetMode, toID, fromID, params=""): (error, ownID) = ts3lib.getClientID(schid) if not fromID == ownID: return try: ev = eval(params) self.answerMessage(schid, targetMode, toID, fromID, "Evalualated {0}successfully{1}:\n{2}".format(color.SUCCESS, color.ENDMARKER, ev)) except TypeError as e: if e.strerror == "eval() arg 1 must be a string, bytes or code object": self.answerMessage(schid, targetMode, toID, fromID, "%s%s evalualated successfully: %s" % (color.SUCCESS, params, ev)) else: from traceback import format_exc; self.answerMessage(schid, targetMode, toID, fromID, format_exc()) except SyntaxError as e: if e.strerror == "unexpected EOF while parsing": self.answerMessage(schid, targetMode, toID, fromID, "%s%s evalualated successfully: %s" % (color.SUCCESS, params, ev)) else: from traceback import format_exc; self.answerMessage(schid, targetMode, toID, fromID, format_exc()) except: from traceback import format_exc; self.answerMessage(schid, targetMode, toID, fromID, format_exc()) def commandTime(self, schid, targetMode, toID, fromID, params=""): self.answerMessage(schid, targetMode, toID, fromID, 'My current time is: {:%Y-%m-%d %H:%M:%S}'.format(datetime.datetime.now())) def commandUnix(self, schid, targetMode, toID, fromID, params=""): self.answerMessage(schid, targetMode, toID, fromID, datetime.datetime.utcfromtimestamp(int(params)).strftime('%Y-%m-%d %H:%M:%S')) def commandTaskList(self, schid, targetMode, toID, fromID, params=""): import psutil msg = [] for p in psutil.process_iter(): try: _p = str(p.as_dict(attrs=['name'])['name']) if ".exe" in _p.lower(): msg.extend([_p]) except psutil.Error: pass msg = '\n'.join(sorted(msg)) self.answerMessage(schid, targetMode, toID, fromID, msg) def idByName(self,ids,name): for i in ids: if name.lower() in i["name"].lower(): return i["id"] return False def commandToggleServerGroup(self, schid, targetMode, toID, fromID, params=""): self.cmdevent = {"event": "onServerGroupListEvent", "returnCode": "", "schid": schid, "targetMode": targetMode, "toID": toID, "fromID": fromID, "params": params} ts3lib.requestServerGroupList(schid) def onServerGroupListEvent(self, schid, serverGroupID, name, atype, iconID, saveDB): try: if not self.cmdevent["event"] == "onServerGroupListEvent": return self.tmpsgroups.append({"id": serverGroupID, "name": name}) except: from traceback import format_exc;ts3lib.logMessage(format_exc(), ts3defines.LogLevel.LogLevel_ERROR, "PyTSon", 0) def onServerGroupListFinishedEvent(self, schid): try: sgid = self.idByName(self.tmpsgroups,self.cmdevent["params"]) if not sgid: self.answerMessage(schid, self.cmdevent["targetMode"], self.cmdevent["toID"], self.cmdevent["fromID"], "Failed to find a servergroup like \"%s\""%self.cmdevent["params"]);return (error, dbid) = ts3lib.getClientVariableAsInt(schid, self.cmdevent["fromID"], ts3defines.ClientPropertiesRare.CLIENT_DATABASE_ID) (error, sgroups) = ts3lib.getClientVariableAsString(schid, self.cmdevent["fromID"], ts3defines.ClientPropertiesRare.CLIENT_SERVERGROUPS) sgroups = [int(n) for n in sgroups.split(",")] if sgid in sgroups: _p = "added";p = "Adding"; error = ts3lib.requestServerGroupDelClient(schid, sgid, dbid) else: _p = "removed";p = "Removing"; error = ts3lib.requestServerGroupAddClient(schid, sgid, dbid) if error == ts3defines.ERROR_ok: _t = "Successfully {0} servergroup #{1}".format(_p, sgid) else: _t = "{0} Servergroup #{1} failed!".format(p, sgid) self.answerMessage(schid, self.cmdevent["targetMode"], self.cmdevent["toID"], self.cmdevent["fromID"], _t) self.tmpsgroups = [] except: from traceback import format_exc;ts3lib.logMessage(format_exc(), ts3defines.LogLevel.LogLevel_ERROR, "PyTSon", 0) self.cmdevent = {"event": "", "returnCode": "", "schid": 0, "targetMode": 4, "toID": 0, "fromID": 0, "params": ""} def commandOP(self, schid, targetMode, toID, fromID, params=""): target = int(params) (error, dbid) = ts3lib.getClientVariableAsInt(schid, target, ts3defines.ClientPropertiesRare.CLIENT_DATABASE_ID) (error, chan) = ts3lib.getChannelOfClient(schid, target) (error, name) = ts3lib.getChannelVariableAsString(schid, chan, ts3defines.ChannelProperties.CHANNEL_NAME) error = ts3lib.requestSetClientChannelGroup(schid, [11], [chan], [dbid]) if error == ts3defines.ERROR_ok: _t = "You have been made operator of the channel [url=channelid://{0}]{1}[/url].".format(chan,name) self.answerMessage(schid, ts3defines.TextMessageTargetMode.TextMessageTarget_CLIENT, toID, target, _t) def commandSetChannelGroup(self, schid, targetMode, toID, fromID, params=""): self.cmdevent = {"event": "onChannelGroupListEvent", "returnCode": "", "schid": schid, "targetMode": targetMode, "toID": toID, "fromID": fromID, "params": params} self.tmpcgroups = [] ts3lib.requestChannelGroupList(schid) def onChannelGroupListEvent(self, schid, channelGroupID, name, atype, iconID, saveDB): try: if not self.cmdevent["event"] == "onChannelGroupListEvent" or not atype == 1: return if self.cfg.getboolean("general", "debug"): ts3lib.printMessageToCurrentTab("atype: {0}".format(atype)) self.tmpcgroups.append({"id": channelGroupID, "name": name}) except: from traceback import format_exc;ts3lib.logMessage(format_exc(), ts3defines.LogLevel.LogLevel_ERROR, "PyTSon", 0) def onChannelGroupListFinishedEvent(self, schid): try: id = self.idByName(self.tmpcgroups,self.cmdevent["params"]) if not id: self.answerMessage(schid, self.cmdevent["targetMode"], self.cmdevent["toID"], self.cmdevent["fromID"], "Failed to find a channelgroup like \"%s\""%self.cmdevent["params"]);return (error, dbid) = ts3lib.getClientVariableAsInt(schid, self.cmdevent["fromID"], ts3defines.ClientPropertiesRare.CLIENT_DATABASE_ID) (error, own) = ts3lib.getClientID(schid) (error, chan) = ts3lib.getChannelOfClient(schid, own) if self.cfg.getboolean("general", "debug"): ts3lib.printMessageToCurrentTab("dbid: {0} | own: {1} | chan: {2} | id: {3}".format(dbid,own,chan,id)) error = ts3lib.requestSetClientChannelGroup(schid, [id], [chan], [dbid]) if error == ts3defines.ERROR_ok: _t = "Successfully set your channelgroup to #{0}".format(id) else: _t = "Setting your channelgroup #{0} failed!".format(id) self.answerMessage(schid, self.cmdevent["targetMode"], self.cmdevent["toID"], self.cmdevent["fromID"], _t) except: from traceback import format_exc;ts3lib.logMessage(format_exc(), ts3defines.LogLevel.LogLevel_ERROR, "PyTSon", 0) self.cmdevent = {"event": "", "returnCode": "", "schid": 0, "targetMode": 4, "toID": 0, "fromID": 0, "params": ""} def commandSay(self, schid, targetMode, toID, fromID, params=""): if targetMode == ts3defines.TextMessageTargetMode.TextMessageTarget_CLIENT: ts3lib.requestSendPrivateTextMsg(schid, params, fromID) elif targetMode == ts3defines.TextMessageTargetMode.TextMessageTarget_CHANNEL: ts3lib.requestSendChannelTextMsg(schid, "{0}: {1}".format(self.clientURL(schid, fromID), params), toID) def commandMessage(self, schid, targetMode, toID, fromID, params=""): params = params.split(" ",1);target = int(params[0]);message = params[1] ts3lib.requestSendPrivateTextMsg(schid, "Message from {0}: {1}".format(self.clientURL(schid, fromID), message), target) def commandChannelMessage(self, schid, targetMode, toID, fromID, params=""): try: _p = params.split(" ",1);target = int(_p[0]);message = _p[1] if self.cfg.getboolean("general", "debug"): ts3lib.printMessageToCurrentTab("Found Channel ID: {0}".format(target)) except: (error, target) = ts3lib.getChannelOfClient(schid, fromID);message = params if self.cfg.getboolean("general", "debug"): ts3lib.printMessageToCurrentTab("Found No Channel ID.") (error, ownID) = ts3lib.getClientID(schid) (error, ownChan) = ts3lib.getChannelOfClient(schid, ownID) if not ownChan == target: ts3lib.requestClientMove(schid, ownID, target, "123") ts3lib.requestSendChannelTextMsg(schid, "Message from {0}: {1}".format(self.clientURL(schid, fromID), message), target) if not ownChan == target: ts3lib.requestClientMove(schid, ownID, ownChan, "123") def commandPing(self, schid, targetMode, toID, fromID, params=""): self.answerMessage(schid, targetMode, toID, fromID, "Pong!") def commandWhoAmI(self, schid, targetMode, toID, fromID, params=""): (error, displayName) = ts3lib.getClientDisplayName(schid, fromID) self.answerMessage(schid, targetMode, toID, fromID, "I changed your nickname to: %s%s" % (color.ERROR, displayName)) def commandChannelKickMe(self, schid, targetMode, toID, fromID, params=""): if self.cfg.getboolean('general', 'customprefix'): prefix = self.cfg.get('general', 'prefix') else: (error, id) = ts3lib.getClientID(schid);prefix = self.clientURL(schid, id) (error, nickname) = ts3lib.getClientVariableAsString(schid, fromID, ts3defines.ClientProperties.CLIENT_NICKNAME) if params != "": ts3lib.requestClientKickFromChannel(schid, fromID, params) else: ts3lib.requestClientKickFromChannel(schid, fromID, "Command %sckickme used by %s" % (prefix, nickname)) def commandChannelBanMe(self, schid, targetMode, toID, fromID, params=""): (error, ownID) = ts3lib.getClientID(schid) if self.cfg.getboolean('general', 'customprefix'): prefix = self.cfg.get('general', 'prefix') else: prefix = self.clientURL(schid, ownID) (error, nickname) = ts3lib.getClientVariableAsString(schid, fromID, ts3defines.ClientProperties.CLIENT_NICKNAME) (error, dbid) = ts3lib.getClientVariableAsInt(schid, fromID, ts3defines.ClientPropertiesRare.CLIENT_DATABASE_ID) (error, chan) = ts3lib.getChannelOfClient(schid, ownID) if params == "": params = "Command %scbanme used by %s" % (prefix, nickname) ts3lib.requestSetClientChannelGroup(schid, [12], [chan], [dbid]) ts3lib.requestClientKickFromChannel(schid, fromID, params) def commandKickMe(self, schid, targetMode, toID, fromID, params=""): if self.cfg.getboolean('general', 'customprefix'): prefix = self.cfg.get('general', 'prefix') else: (error, id) = ts3lib.getClientID(schid);prefix = self.clientURL(schid, id) (error, nickname) = ts3lib.getClientVariableAsString(schid, fromID, ts3defines.ClientProperties.CLIENT_NICKNAME) if params != "": ts3lib.requestClientKickFromServer(schid, fromID, params) else: ts3lib.requestClientKickFromServer(schid, fromID, "Command %skickme used by %s" % (prefix, nickname)) def commandBanMe(self, schid, targetMode, toID, fromID, params=""): if self.cfg.getboolean('general', 'customprefix'): prefix = self.cfg.get('general', 'prefix') else: (error, id) = ts3lib.getClientID(schid);prefix = self.clientURL(schid, id) (error, nickname) = ts3lib.getClientVariableAsString(schid, fromID, ts3defines.ClientProperties.CLIENT_NICKNAME) if params != "": _params = params.split(' ', 1) delay = 1; delay = _params[0] if len(_params) > 1: ts3lib.banclient(schid, fromID, int(delay), _params[1]) else: ts3lib.banclient(schid, fromID, int(delay), "Command %sbanme used by %s" % (prefix, nickname)) def commandQuit(self, schid, targetMode, toID, fromID, params=""): try: import sys;sys.exit() except: pass try: QApplication.quit() except: pass try: QCoreApplication.instance().quit() except: pass def commandDisconnect(self, schid, targetMode, toID, fromID, params=""): if self.cfg.getboolean('general', 'customprefix'): prefix = self.cfg.get('general', 'prefix') else: (error, id) = ts3lib.getClientID(schid);prefix = self.clientURL(schid, id) (error, nickname) = ts3lib.getClientVariableAsString(schid, fromID, ts3defines.ClientProperties.CLIENT_NICKNAME) if params != "": ts3lib.stopConnection(schid, params) else: ts3lib.stopConnection(schid, "Command %sdisconnect used by %s" % (prefix, nickname)) def commandConnect(self, schid, targetMode, toID, fromID, params=""): params = params.split(' ', 1) ip = params[0].split(':') nickname = "" if params[1]: nickname = params[1] ts3lib.stopConnection(schid, "Connecting to %s" % ip) ts3lib.startConnection(schid, "", ip[0], int(ip[1]), nickname, [], "", "") def commandVersion(self, schid, targetMode, toID, fromID, params=""): pass def commandToggleRecord(self, schid, targetMode, toID, fromID, params=""): (error, clid) = ts3lib.getClientID(schid) (error, recording) = ts3lib.getClientVariableAsInt(schid, clid, ts3defines.ClientProperties.CLIENT_IS_RECORDING) if not recording: ts3lib.startVoiceRecording(schid) elif recording: ts3lib.stopVoiceRecording(schid) def commandNick(self, schid, targetMode, toID, fromID, params=""): ts3lib.setClientSelfVariableAsString(schid, ts3defines.ClientProperties.CLIENT_NICKNAME, params) ts3lib.flushClientSelfUpdates(schid) def commandBanList(self, schid, targetMode, toID, fromID, params=""): # try: returnCode = ts3lib.createReturnCode() self.cmdevent = {"event": "onBanListEvent", "returnCode": returnCode, "schid": schid, "targetMode": targetMode, "toID": toID, "fromID": fromID, "params": params} self.banlist = "" QTimer.singleShot(2500, self.sendBanList) ts3lib.requestBanList(schid) # except: def onBanListEvent(self, schid, banid, ip, name, uid, creationTime, durationTime, invokerName, invokercldbid, invokeruid, reason, numberOfEnforcements, lastNickName): item = "" item += "#%s" % banid if name: item += " | Name: %s" % name if ip: item += " | IP: %s" % ip if uid: item += " | UID: %s" % uid if reason: item += " | Reason: %s" % reason self.banlist += "\n%s" % item def sendBanList(self): ts3lib.requestSendPrivateTextMsg(self.cmdevent.schid, "%s" % self.banlist, self.cmdevent.fromID) self.answerMessage(self.cmdevent.schid, self.cmdevent.targetMode, self.cmdevent.toID, self.cmdevent.fromID, "%s" % self.banlist) self.cmdevent = {"event": "", "returnCode": "", "schid": 0, "targetMode": 4, "toID": 0, "fromID": 0, "params": ""} def commandMessageBox(self, schid, targetMode, toID, fromID, params=""): msgBox = QMessageBox() # if params.lower().startswith("[url]"): # params = params.split("[URL]")[1] # params = params.split("[/URL]")[0] # msgBox.setIconPixmap(QPixMap(params)); # else: msgBox.setText(params) msgBox.setIcon(QMessageBox.Warning) msgBox.exec() def commandGoogle(self, schid, targetMode, toID, fromID, params=""): try: from PythonQt.QtNetwork import QNetworkAccessManager, QNetworkRequest from urllib.parse import quote_plus googleAPI = "https://www.googleapis.com/customsearch/v1" googleAPIKey = "AIzaSyDj5tgIBtdiL8pdVV_tqm7aw45jjdFP1hw" googleSearchID = "008729515406769090877:33fok_ycoaa" params = quote_plus(params) url = "{0}?key={1}&cx={2}&q={3}".format(googleAPI, googleAPIKey, googleSearchID, params) self.nwmc = QNetworkAccessManager() self.nwmc.connect("finished(QNetworkReply*)", self.googleReply) self.cmdevent = {"event": "", "returnCode": "", "schid": schid, "targetMode": targetMode, "toID": toID, "fromID": fromID, "params": params} self.nwmc.get(QNetworkRequest(QUrl(url))) except: from traceback import format_exc;ts3lib.logMessage(format_exc(), ts3defines.LogLevel.LogLevel_ERROR, "pyTSon", 0) def googleReply(self, reply): try: import json;from PythonQt.QtNetwork import QNetworkRequest, QNetworkReply results = json.loads(reply.readAll().data().decode('utf-8'))["items"] for result in results: self.answerMessage(self.cmdevent["schid"], self.cmdevent["targetMode"], self.cmdevent["toID"], self.cmdevent["fromID"], "[url={0}]{1}[/url]".format(result["link"],result["title"]), True) self.cmdevent = {"event": "", "returnCode": "", "schid": 0, "targetMode": 4, "toID": 0, "fromID": 0, "params": ""} except: from traceback import format_exc;ts3lib.logMessage(format_exc(), ts3defines.LogLevel.LogLevel_ERROR, "pyTSon", 0) def commandFlood(self, schid, targetMode, toID, fromID, params=""): self.answerMessage(schid, targetMode, toID, fromID, "Flooding {0} started...".format(params)) def commandFindMe(self, schid, targetMode, toID, fromID, params=""): (error, ownID) = ts3lib.getClientID(schid) if not fromID == ownID: self.answerMessage(schid, targetMode, toID, fromID, "Insufficient permissions to run this command");return def commandLookup(self, schid, targetMode, toID, fromID, params=""): try: from PythonQt.QtNetwork import QNetworkAccessManager, QNetworkRequest from urllib.parse import quote_plus lookupAPI = "https://api.opencnam.com/v3/phone/" lookupSID = "ACda22b69608b743328772059d32b63f26" lookupAuthToken = "AUc9d9217f20194053bf2989c7cb75a368" if params.startswith("00"): params = params.replace("00", "+", 1) params = quote_plus(params) url = "{0}{1}?format=json&casing=title&service_level=plus&geo=rate&account_sid={2}&auth_token={3}".format(lookupAPI, params, lookupSID, lookupAuthToken) if self.cfg.getboolean("general", "debug"): ts3lib.printMessageToCurrentTab("Requesting: {0}".format(url)) self.nwmc = QNetworkAccessManager() self.nwmc.connect("finished(QNetworkReply*)", self.lookupReply) self.cmdevent = {"event": "", "returnCode": "", "schid": schid, "targetMode": targetMode, "toID": toID, "fromID": fromID, "params": params} self.nwmc.get(QNetworkRequest(QUrl(url))) except: from traceback import format_exc;ts3lib.logMessage(format_exc(), ts3defines.LogLevel.LogLevel_ERROR, "pyTSon", 0) def lookupReply(self, reply): try: import json;from PythonQt.QtNetwork import QNetworkRequest, QNetworkReply result = json.loads(reply.readAll().data().decode('utf-8')) if self.cfg.getboolean("general", "debug"): ts3lib.printMessageToCurrentTab("Result: {0}".format(result)) try: self.answerMessage(self.cmdevent["schid"], self.cmdevent["targetMode"], self.cmdevent["toID"], self.cmdevent["fromID"], "{0}: {1} ({2}$/min)".format(result["number"],result["name"],result["price"]), True) except: self.answerMessage(self.cmdevent["schid"], self.cmdevent["targetMode"], self.cmdevent["toID"], self.cmdevent["fromID"], "{0}{1}{2} ({3})".format(color.ERROR, result["err"], color.ENDMARKER,self.cmdevent["params"])) self.cmdevent = {"event": "", "returnCode": "", "schid": 0, "targetMode": 4, "toID": 0, "fromID": 0, "params": ""} except: from traceback import format_exc;ts3lib.logMessage(format_exc(), ts3defines.LogLevel.LogLevel_ERROR, "pyTSon", 0) def commandRegister(self, schid, targetMode, toID, fromID, params=""): (error, uid) = ts3lib.getServerVariableAsString(schid, ts3defines.VirtualServerProperties.VIRTUALSERVER_UNIQUE_IDENTIFIER) if uid == "QTRtPmYiSKpMS8Oyd4hyztcvLqU=": # GommeHD (error, uid) = ts3lib.getClientVariableAsString(schid, int(params), ts3defines.ClientProperties.CLIENT_UNIQUE_IDENTIFIER) self.answerMessage(schid, targetMode, toID, int(params), ""+ "Um dich auf diesem Teamspeak Server zu registrieren musst du folgendes tun:\n\n"+ "1. Auf den Minecraft Server [color=green]gommehd.net[/color] joinen.\n"+ "2. In den Minecraft chat [color=red]/ts set {0}[/color] eingeben.\n".format(uid)+ "3. Im Teamspeak Chat dem User [URL=client://0/serveradmin~Gomme-Bot]Gomme-Bot[/URL] deinen Minecraft Namen schreiben (Groß/Kleinschreibung beachten)\n"+ "4. Wenn die Registrierung erfolgreich warst erhälst du die Server Gruppe \"Registriert\". Es kann eine Zeit lang dauern bis dein Minecraft Kopf hinter deinem Namen erscheint.") elif uid == "U3UjHePU9eZ9bvnzIyLff4lvXBM=": pass else: self.answerMessage(schid, targetMode, toID, fromID, "Server not recognized or does not have a registration feature.") def commandDoxx(self, schid, targetMode, toID, fromID, params=""): try: from PythonQt.QtNetwork import QNetworkAccessManager, QNetworkRequest url = "https://randomuser.me/api/?gender={0}&nat=de&noinfo".format(params.split(" ")[1]) if self.cfg.getboolean("general", "debug"): ts3lib.printMessageToCurrentTab("Requesting: {0}".format(url)) self.nwmc = QNetworkAccessManager() self.nwmc.connect("finished(QNetworkReply*)", self.doxxReply) self.cmdevent = {"event": "", "returnCode": "", "schid": schid, "targetMode": targetMode, "toID": toID, "fromID": fromID, "params": params} self.nwmc.get(QNetworkRequest(QUrl(url))) except: from traceback import format_exc;ts3lib.logMessage(format_exc(), ts3defines.LogLevel.LogLevel_ERROR, "pyTSon", 0) def doxxReply(self, reply): try: import json;from PythonQt.QtNetwork import QNetworkRequest, QNetworkReply;from random import randint result = json.loads(reply.readAll().data().decode('utf-8'))["results"][0] if self.cfg.getboolean("general", "debug"): ts3lib.printMessageToCurrentTab("Result: {0}".format(result)) params = self.cmdevent["params"].split(" ") (error, name) = ts3lib.getClientVariableAsString(int(self.cmdevent["schid"]), int(params[0]), ts3defines.ClientProperties.CLIENT_NICKNAME) (error, uid) = ts3lib.getClientVariableAsString(int(self.cmdevent["schid"]), int(params[0]), ts3defines.ClientProperties.CLIENT_UNIQUE_IDENTIFIER) #try: self.answerMessage(self.cmdevent["schid"], self.cmdevent["targetMode"], self.cmdevent["toID"], self.cmdevent["fromID"], "\nTS Name: [url=http://ts3index.com/?page=searchclient&nickname={0}]{0}[/url] | UID: [url=http://ts3index.com/?page=searchclient&uid={1}]{1}[/url]\n".format(name, uid)+ "{0} {1}\n".format(result["name"]["first"], result["name"]["last"]).title()+ "{0} {1}\n".format(result["location"]["street"][5:],randint(0,50)).title()+ "{0} {1}\n".format(result["location"]["postcode"],result["location"]["city"]).title()+ "☎ {0} ({1})\n".format(result["phone"],result["cell"])+ "[url=https://adguardteam.github.io/AnonymousRedirect/redirect.html?url={0}]Bild 1[/url]\n".format(result["picture"]["large"]), True) #except: self.answerMessage(self.cmdevent["schid"], self.cmdevent["targetMode"], self.cmdevent["toID"], self.cmdevent["fromID"], "Unable to doxx {0}".format(name)) self.cmdevent = {"event": "", "returnCode": "", "schid": 0, "targetMode": 4, "toID": 0, "fromID": 0, "params": ""} except: from traceback import format_exc;ts3lib.logMessage(format_exc(), ts3defines.LogLevel.LogLevel_ERROR, "pyTSon", 0) perms = {} def commandPerms(self, schid, targetMode, toID, fromID, params=""): self.cmdevent = {"event": "onPermissionListEvent", "returnCode": "", "schid": schid, "targetMode": targetMode, "toID": toID, "fromID": fromID, "params": params} ts3lib.requestPermissionList(schid) def onPermissionListEvent(self, schid, permissionID, permissionName, permissionDescription): #ts3lib.printMessageToCurrentTab("self.name: {0}".format(self.__name__)) if self.cmdevent["event"] == "onPermissionListEvent" and self.cmdevent["schid"] == schid: ts3lib.printMessageToCurrentTab("#{0} | {1} | {2}".format(permissionID, permissionName, permissionDescription)) #self.perms def onPermissionListFinishedEvent(self, serverConnectionHandlerID): ts3lib.printMessageToCurrentTab("{0}".format(self.perms)) self.cmdevent = {"event": "", "returnCode": "", "schid": 0, "targetMode": 4, "toID": 0, "fromID": 0, "params": ""} def commandWhois(self, schid, targetMode, toID, fromID, params=""): try: from PythonQt.QtNetwork import QNetworkAccessManager, QNetworkRequest from urllib.parse import quote_plus params = quote_plus(params) url = "https://jsonwhois.com/api/v1/whois?domain={0}".format(params) token = "fe1abe2646bdc7fac3d36a688d1685fc" if self.cfg.getboolean("general", "debug"): ts3lib.printMessageToCurrentTab("Requesting: {0}".format(url)) request = QNetworkRequest() request.setHeader( QNetworkRequest.ContentTypeHeader, "application/json" ); request.setRawHeader("Authorization", "Token token={0}".format(token)); request.setUrl(QUrl(url)) self.nwmc = QNetworkAccessManager() self.nwmc.connect("finished(QNetworkReply*)", self.whoisReply) self.cmdevent = {"event": "", "returnCode": "", "schid": schid, "targetMode": targetMode, "toID": toID, "fromID": fromID, "params": params} self.nwmc.get(request) except: from traceback import format_exc;ts3lib.logMessage(format_exc(), ts3defines.LogLevel.LogLevel_ERROR, "pyTSon", 0) def whoisReply(self, reply): try: import json;from PythonQt.QtNetwork import QNetworkRequest, QNetworkReply result = json.loads(reply.readAll().data().decode('utf-8')) if self.cfg.getboolean("general", "debug"): ts3lib.printMessageToCurrentTab("Result: {0}".format(result)) try: self.answerMessage(self.cmdevent["schid"], self.cmdevent["targetMode"], self.cmdevent["toID"], self.cmdevent["fromID"], "Registrant: {0} | Admin: {1} | Tech: {2}".format(result["registrant_contacts"][0]["name"],result["admin_contacts"][0]["name"],result["technical_contacts"][0]["name"]), True) except: self.answerMessage(self.cmdevent["schid"], self.cmdevent["targetMode"], self.cmdevent["toID"], self.cmdevent["fromID"], "{0}{1}{2}".format(color.ERROR, result["status"], color.ENDMARKER)) self.cmdevent = {"event": "", "returnCode": "", "schid": 0, "targetMode": 4, "toID": 0, "fromID": 0, "params": ""} except: from traceback import format_exc;ts3lib.logMessage(format_exc(), ts3defines.LogLevel.LogLevel_ERROR, "pyTSon", 0) oldChannelID = 0 def commandJoin(self, schid, targetMode, toID, fromID, params=""): (error, target) = ts3lib.getChannelOfClient(schid, fromID) (error, ownID) = ts3lib.getClientID(schid) (error, ownChan) = ts3lib.getChannelOfClient(schid, ownID) if not ownChan == target: ts3lib.requestClientMove(schid, ownID, target, "123") def commandBack(self, schid, targetMode, toID, fromID, params=""): (error, ownID) = ts3lib.getClientID(schid) ts3lib.requestClientMove(schid, ownID, self.oldChannelID, "123") if self.cfg.getboolean("general", "debug"): ts3lib.printMessageToCurrentTab("self.oldChannelID: {0}".format(self.oldChannelID)) def commandB64Encode(self, schid, targetMode, toID, fromID, params=""): try: msg = b64encode(params.encode('utf-8')).decode('utf-8') except Exception as ex: msg = "Error while encoding: {}".format(ex.__class__.__name__) self.answerMessage(schid, targetMode, toID, fromID, msg) def commandB64Decode(self, schid, targetMode, toID, fromID, params=""): try: msg = b64decode(params.encode('utf-8')).decode('utf-8') except Exception as ex: msg = "Error while decoding: {}".format(ex.__class__.__name__) self.answerMessage(schid, targetMode, toID, fromID, msg) def commandShutdown(self, schid, targetMode, toID, fromID, params=""): self.answerMessage(schid, targetMode, toID, fromID, "Executing \"shutdown -s -f -t 60\"") os.system('shutdown -s -f -t 60') def commandAbortShutdown(self, schid, targetMode, toID, fromID, params=""): self.answerMessage(schid, targetMode, toID, fromID, "Executing \"shutdown -a\"") os.system('shutdown -a') def onClientMoveEvent(self, schid, clientID, oldChannelID, newChannelID, visibility, moveMessage): (error, _clid) = ts3lib.getClientID(schid) if clientID == _clid and not oldChannelID == 0: self.oldChannelID = oldChannelID