简体   繁体   中英

Python twisted irc - server password on login

I'm trying to create a simple IRC bot in Python using Twisted. I've come pretty far but have encountered a problem when I need to provide the password to enter the server.

I know how to implement a password for joining a specific channel but I have no clue how to provide a username and password upon joining the IRC server itself.

The reason I need to provide a password is that I want the bot to be bouncer-compatible (ZNC).

(Excuse the lousy indentation)

This is what I've tried so far

import re
import urllib2
import random
import time
import sys
from HTMLParser import HTMLParser
from twisted.internet import reactor
from twisted.words.protocols import irc
from twisted.internet import protocol

def is_valid_int(num):
"""Check if input is valid integer"""
    try:
        int(num)
        return True
    except ValueError:
        return False

def isAdmin(user):
    with open("admins.txt", "r") as adminfile:
        lines = adminfile.readlines()
        if not lines:
            return False

        if user in lines:
            return True
        else:
            return False

class Bot(irc.IRCClient):
    def _get_nickname(self):
        return self.factory.nickname

    nickname = property(_get_nickname)

    # @Event Signed on
    def signedOn(self):
        self.join(self.factory.channel)
        print "Signed on as %s." % (self.nickname,)

    # @Event Joined
    def joined(self, channel):
        print "Joined %s." % (channel,)

    # @Event Privmsg
    def privmsg(self, user, channel, msg):
        if msg == "!time":
            msg = time.strftime("%a, %d %b %Y %H:%M:%S", time.gmtime())
            self.msg(channel, msg)

        # Google searhc
        elif msg.startswith("!google"):
            msg = msg.split(" ", 2)
            msg = "https://www.google.com/search?q=" + msg[1]
            self.msg(channel, msg)

        # Quit connection
        elif msg.startswith("!quit"):
        self.quit("byebye")

        # Set nickname
        elif msg.startswith("!nick"):
        msg = msg.split(" ", 2)
        newNick = msg[1]
        self.setNick(newNick)

        # Invite to channel
        elif msg.startswith("!invite"):
        msg = msg.split(" ", 2)
        channel = msg[1]
        self.join(channel)
        print("Joined channel %s" % channel)

        # Leave channel
        elif msg.startswith("!leave"):
        msg = msg.split(" ", 2)
        channel = msg[1]
        self.leave(channel)
        print("Left channel %s" % (channel))

        # Dice roll
        elif msg.startswith("!roll"):
            user = user.split("!", 2)
            nick = user[0]
            self.msg(channel, nick + " rolled a " + str(random.randint(0,100)))
            print("Rolled dice...")

        # Op user
        elif msg.startswith("!op") or msg.startswith("!+o"):
            msg = msg.split(" ", 2)
            nick = msg[1]

            if isAdmin(nick) == True:
                self.mode(channel, True, "o", user=nick)
            else:
                self.msg(channel, "Not registered as admin, contact bot owner.")

        # Deop user
        elif msg.startswith("!deop") or msg.startswith("!-o"):
            msg = msg.split(" ", 2)
            nick = msg[1]

            if isAdmin(nick) == True:
                self.mode(channel, False, "o", user=nick)
            else:
                self.msg(channel, "Not registered as admin, contact bot owner.")

        # Voice user
        elif msg.startswith("!voice") or msg.startswith("!+v"):
            msg = msg.split(" ", 2)
            nick = msg[1]

            if isAdmin(nick) == True:
                self.mode(channel, True, "v", user=nick)
            else:
                self.msg(channel, "Not registered as admin, contact bot owner.")

        # Devoice user
        elif msg.startswith("!devoice") or msg.startswith("!-v"):
            msg = msg.split(" ", 2)
            nick = msg[1]

            if isAdmin(nick) == True:
                self.mode(channel, False, "v", user=nick)
            else:
                self.msg(channel, "Not registered as admin, contact bot owner.")



class BotFactory(protocol.ClientFactory):
"""Factory for our bot"""
protocol = Bot

    def __init__(self, channel, nickname="IRCBot", username=None, password=None):
        self.channel = channel
        self.nickname = nickname
        self.username = username
        self.password = password

    def clientConnectionLost(self, connector, reason):
        print "Lost connection: (%s)" % (reason,)

    def clientConnectionFailed(self, connector, reason):
        print "Could not connect: %s" % (reason,)


if __name__ == "__main__":
reactor.connectTCP("my.irc.server.com", 6667, BotFactory("Channel", "IRCBot", "Name", "Password"))
reactor.run()

I can't find anything in the Twisted documentation about server passwords, only channel passwords. Any help is greatly appreciated!

Take a look at

http://twistedmatrix.com/documents/current/api/twisted.words.protocols.irc.IRCClient.html

I notice the attribute password , with the description:

password =
    Password used to log on to the server. May be None. 

It seems to me you can set password attribute on your Bot class, thus

class Bot(irc.IRCClient):
    def _get_nickname(self):
        return self.factory.nickname

    nickname = property(_get_nickname)
    password = "PASSWORD"

    ...

Does it makes sense? And does it work?

All the best :)

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM