Search code examples
pythonxchat2

Variable being sent as blank in message


I'm trying to write a previous messages bot for (he)xchat. Saving and printing the messages is fine, but when it sends it doesn't retain the message.

I've tried all sorts of methods to fix it but it's always blank.

Problem area:

for y in range(0, 14):                
    if msg_last[y]:     
        msg_to_say = 'privmsg ' + triggernick + ' <previously_bot> '
        msg_to_say = msg_to_say + msg_last[y]
        print (msg_to_say)
        destination.command(msg_to_say)

Inside of Xchat it'll print:

privmsg <nick> <previously_bot> $msg

but upon sending it it'll be:

privmsg <nick> <previously_bot> 

Can anyone spot what I've missed?

Full code:

from random import randint
import xchat

__module_name__ = "Blake's Previous Messages Bot"
__module_version__ = " v0.1 "
__module_description__ = "A previous message bot"

print("\0034", __module_name__, __module_version__, __module_description__, "!\003")

#---Globals---#000000#FFFFFF----------------------------------------------------
msg_last = [str()] * 15
msg_count = 0

def on_chat(word, word_eol, userdata):
    global msg_count
    global msg_last
    msg = word[1]

    if msg_count == 15:
        #print ("Full, reloading list")
        for x in range(0, 14):
             msg_last[x + 1] = msg_last[x]
        msg_last[0] = msg
        msg_count = 0

    msg_last[msg_count] = msg
    msg_count = msg_count + 1

def on_join(word, word_eol, userdata):
    global msg_last
    triggernick, triggerchannel, triggerhost = word    
    destination = xchat.get_context()

    print ("Someone joined, pulling up log")

    for y in range(0, 14):                
        if msg_last[y]:

          msg_to_say = 'privmsg ' + triggernick + ' <previously_bot> '
          msg_to_say = msg_to_say + msg_last[y]
          print (msg_to_say)
          destination.command(msg_to_say)
    return xchat.EAT_ALL

def on_kevin(word, word_eol, userdata):
    triggernick, triggerchannel, triggerhost = word    
    destination = xchat.get_context()

    if triggernick == 'TenEighths':
      rnd = randint(0,2)
      if rnd == 2:
        rnd2 = randint(0,3)
        rnd_str = heyYouKevin()
        destination.command("say " + rnd_str)

    #print ("Someone joined, pulling up log")

def heyYouKevin(x):
    return {
        '0': 'be quiet Kevin',
        '1': 'omg TenEighths, will you be quiet already?',
        '2': 'Kevin is spouting nonsense',
        '3': "be quiet, TenEighths.",
    }[x] 

xchat.hook_print('Join', on_join)
xchat.hook_print('Channel Message', on_chat)
xchat.hook_print('Channel Message', on_kevin)

Solution

  • If you use the raw irc command PRIVMSG the syntax requires that any strings with spaces start with :. So PRIVMSG nick :This is a long string. The better solution is to just use xchat.command('msg nick ...') since it knows what to do.