Exemple #1
0
 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)))
Exemple #2
0
 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)))
Exemple #4
0
 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)
Exemple #5
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"))
Exemple #6
0
 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)))
Exemple #7
0
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()
Exemple #8
0
 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)
Exemple #9
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)))
Exemple #10
0
 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")
Exemple #11
0
 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))
Exemple #12
0
 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)
Exemple #13
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)
Exemple #14
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
        """
Exemple #15
0
 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())
Exemple #16
0
    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))
Exemple #17
0
 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)
Exemple #18
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))
Exemple #19
0
 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"))
Exemple #20
0
    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
Exemple #21
0
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
Exemple #22
0
 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)))
Exemple #23
0
 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))
Exemple #24
0
    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
Exemple #25
0
 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
Exemple #26
0
def getFile(url):
    """

    :param url:
    """
    nwmc = QNetworkAccessManager()
    nwmc.connect("finished(QNetworkReply*)", _getFileReply)
    nwmc.get(QNetworkRequest(QUrl(url)))
Exemple #27
0
def downloadFile(url, path):
    """

    :param url:
    :param path:
    """
    nwmc = QNetworkAccessManager()
    nwmc.connect("finished(QNetworkReply*)", _downloadFileReply)
    dlpath = path
    nwmc.get(QNetworkRequest(QUrl(url)))
Exemple #28
0
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())
Exemple #29
0
def getFile(url):
    nwmc = QNetworkAccessManager()
    nwmc.connect("finished(QNetworkReply*)", getFile)
    nwmc.get(QNetworkRequest(QUrl(url)))
Exemple #30
0
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)
Exemple #31
0
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