2014-10-17 2 views
5

(Не родной английский, извините, возможно, сломанный английский. Я тоже новичок в программировании).
Здравствуйте, я пытаюсь подключиться к серверу TeamSpeak, используя QueryServer, чтобы сделать бота. После нескольких дней борьбы с ним ... это работает, только с одной проблемой, и я застрял с этим.Как сохранить скрипт python 3 (Bot)

Если вам нужно проверить, это API TeamSpeak, что я использую: http://py-ts3.readthedocs.org/en/latest/api/query.html

И это описание того, что происходит на самом деле в моем сценарии:

  1. Он соединяет.
  2. Он проверяет идентификатор канала (и собственный идентификатор клиента)
  3. Она соединяет канал
  4. Сценарий заканчивается, так что разъединяет.

Мой вопрос: как я могу это сделать, не разъединяется? Как заставить скрипт оставаться в состоянии ожидания, чтобы он мог читать, если кто-то набирает «hi bot» в канале? Весь код, необходимый для чтения текстов и ответа на них, кажется легким для программирования, однако мне грозит проблема, когда я не могу сохранить «запуск» бота, так как он закрывает файл, как только он заканчивает выполнение скрипта.

Подробнее:
Я использую Python 3.4.1.
Я пробовал изучать Threading http://www.tutorialspoint.com/python/python_multithreading.htm, но либо M'm немой или он не работает так, как я бы это сделал.
В API есть функция с именем on_event, что я хотел бы продолжать работать все время. Бот-код должен запускаться только один раз, а затем оставаться «ожидающим» до тех пор, пока не произойдет событие. Как мне это сделать? Нет подсказки.

Код:

import ts3 
import telnetlib 
import time 

class BotPrincipal: 
    def Conectar(ts3conn): 
     MiID = [i["client_id"] for i in ts3conn.whoami()] 
     ChannelToJoin = "[Pruebas] Bots" 
     ts3conn.on_event = BotPrincipal.EventHappened() 
     try: 
      BuscandoIDCanal = ts3conn.channelfind(pattern=ChannelToJoin) 
      IDCanal = [i["cid"] for i in BuscandoIDCanal] 
      if not IDCanal: 
       print("No channel found with that name") 
       return None 
      else: 
       MiID = str(MiID).replace("'", "") 
       MiID = str(MiID).replace("]", "") 
       MiID = str(MiID).replace("[", "") 
       IDCanal = str(IDCanal).replace("'", "") 
       IDCanal = str(IDCanal).replace("]", "") 
       IDCanal = str(IDCanal).replace("[", "")     
       print("ID de canal " + ChannelToJoin + ": " + IDCanal) 
       print("ID de cliente " + Nickname + ": " + MiID) 
      try: 
       print("Moving you into: " + ChannelToJoin) 
       ts3conn.clientmove(cid=IDCanal, clid=MiID) #entra al canal 
       try: 
        print("Asking for notifications from: " + ChannelToJoin) 
        ts3conn.servernotifyregister(event="channel", id_=IDCanal) 
        ts3conn.servernotifyregister(event="textchannel", id_=IDCanal) 
       except ts3.query.TS3QueryError: 
        print("You have no permission to use the telnet command: servernotifyregister") 
       print("------- Bot Listo -------") 
      except ts3.query.TS3QueryError: 
       print("You have no permission to use the telnet command: clientmove") 
     except ts3.query.TS3QueryError: 
      print("Error finding ID for " + ChannelToJoin + ". telnet: channelfind") 

    def EventHappened(): 
     print("Doesn't work") 

# Data needed # 
USER = "thisisafakename" 
PASS = "something" 
HOST = "111.111.111.111" 
PORT = 10011 
SID = 1 

if __name__ == "__main__":  
    with ts3.query.TS3Connection(HOST, PORT) as ts3conn: 
     ts3conn.login(client_login_name=USER, client_login_password=PASS) 
     ts3conn.use(sid=SID) 
     print("Connected to "+HOST) 
     BotPrincipal.Conectar(ts3conn) 
+1

В качестве побочного примечания вы не используете классы. Ваш 'Conectar' должен взять параметр' self', и ваш основной код должен построить экземпляр 'BotPrincipal' и вызвать метод Conectar в этом экземпляре и т. Д. Это комбинация из 3 ошибок, отменяющих эту работу , что, вероятно, не то, на что вы хотите положиться. – abarnert

+1

Просто добавив примечание к аборте, просто взгляните на [официальную документацию Python по классам] (https://docs.python.org/3.4/tutorial/classes.html#a-first-look-at-classes) или некоторые [различные учебники] (http://en.wikibooks.org/wiki/A_Beginner's_Python_Tutorial/Classes). – Vyktor

+0

Поскольку я никогда не изучал какой-либо язык программирования, и я стараюсь изо всех сил с помощью Google, я могу видеть, где я потерпел неудачу. Я проверяю этот сайт прямо сейчас и пытаюсь исправить проблемы. Я ценю помощь. – Saelyth

ответ

3

С быстрым проблеском в API, это выглядит, как вам нужно явно указать ts3conn объект ждать событий. Там, кажется, несколько способов сделать это, но ts3conn.recv(True) кажется, наиболее очевидными:

блоков до тех пор пока все несобранные ответы были получены или навсегда, если recv_forever верно.

Предположительно, как каждая команда приходит, она будет вызывать on_event обработчик, а затем, когда вы вернетесь из этого он вернется к ожиданию навсегда для следующей команды.

Я не знаю, если вам нужны темы, здесь или нет, но документы для recv_in_thread сделать это звучит, как вы могли бы:

вызовы recv() в потоке. Это полезно, если вы использовали servernotifyregister и ожидаете получать события.

Предполагается, что вы хотите получить как события servernotify, так и команды, и я предполагаю, что эта библиотека написана, для этого вам нужны потоки? Если это так, просто позвоните ts3conn.recv_in_thread() вместо ts3conn.recv(True). (Если вы посмотрите на 10, все, что делает, запустит фоновый поток и вызовет self.recv(True) на эту тему.)

+0

Позвольте мне посмотреть, понял ли я это. Я должен вызвать ts3conn.recv_in_thread() внутри def EventHappened(): и он создаст свой собственный поток, поэтому мне не нужно это делать самому? – Saelyth

+0

@Saelyth: Не внутри 'EventHappened', либо в конце' Conectar', либо в вашем основном коде после возвращения Conectar'. И да, он создает свою собственную нить, так что вам не нужно. Если вы не пытаетесь сделать что-то в своем обработчике (-ах), которые полагаются на мутирующие глобальные или другие общие переменные, вам не нужно даже беспокоиться о том, что существуют потоки. – abarnert

+0

Yay! спасибо за ответы: D – Saelyth

Смежные вопросы