3
0
mirror of https://github.com/jlu5/PyLink.git synced 2024-11-27 21:19:31 +01:00

Merge branch 'wip/attr-deprecations' into devel

Closes #273.
This commit is contained in:
James Lu 2017-03-05 00:15:03 -08:00
commit 2d03ceebc8
11 changed files with 49 additions and 31 deletions

View File

@ -23,7 +23,7 @@ try:
except ImportError: except ImportError:
raise ImportError("PyLink requires ircmatch to function; please install it and try again.") raise ImportError("PyLink requires ircmatch to function; please install it and try again.")
from . import world, utils, structures, __version__ from . import world, utils, structures, conf, __version__
from .log import * from .log import *
### Exceptions ### Exceptions
@ -33,7 +33,7 @@ class ProtocolError(Exception):
### Internal classes (users, servers, channels) ### Internal classes (users, servers, channels)
class Irc(): class Irc(utils.DeprecatedAttributesObject):
"""Base IRC object for PyLink.""" """Base IRC object for PyLink."""
def __init__(self, netname, proto, conf): def __init__(self, netname, proto, conf):
@ -42,6 +42,11 @@ class Irc():
(a string), the name of the protocol module to use for this connection, (a string), the name of the protocol module to use for this connection,
and a configuration object. and a configuration object.
""" """
self.deprecated_attributes = {
'conf': 'Deprecated since 1.2; consider switching to conf.conf',
'botdata': "Deprecated since 1.2; consider switching to conf.conf['bot']",
}
self.loghandlers = [] self.loghandlers = []
self.name = netname self.name = netname
self.conf = conf self.conf = conf
@ -76,7 +81,7 @@ class Irc():
Initializes any channel loggers defined for the current network. Initializes any channel loggers defined for the current network.
""" """
try: try:
channels = self.conf['logging']['channels'][self.name] channels = conf.conf['logging']['channels'][self.name]
except KeyError: # Not set up; just ignore. except KeyError: # Not set up; just ignore.
return return
@ -101,7 +106,6 @@ class Irc():
(Re)sets an IRC object to its default state. This should be called when (Re)sets an IRC object to its default state. This should be called when
an IRC object is first created, and on every reconnection to a network. an IRC object is first created, and on every reconnection to a network.
""" """
self.botdata = self.conf['bot']
self.pingfreq = self.serverdata.get('pingfreq') or 90 self.pingfreq = self.serverdata.get('pingfreq') or 90
self.pingtimeout = self.pingfreq * 3 self.pingtimeout = self.pingfreq * 3
@ -301,7 +305,7 @@ class Irc():
self.servers[self.sid] = IrcServer(None, host, internal=True, self.servers[self.sid] = IrcServer(None, host, internal=True,
desc=self.serverdata.get('serverdesc') desc=self.serverdata.get('serverdesc')
or self.botdata['serverdesc']) or conf.conf['bot']['serverdesc'])
log.info('(%s) Starting ping schedulers....', self.name) log.info('(%s) Starting ping schedulers....', self.name)
self.schedulePing() self.schedulePing()

View File

@ -75,7 +75,7 @@ def handle_whois(irc, source, command, args):
# 3) +H is set, but whois_use_hideoper is disabled in config # 3) +H is set, but whois_use_hideoper is disabled in config
isHideOper = (irc.umodes.get('hideoper'), None) in user.modes isHideOper = (irc.umodes.get('hideoper'), None) in user.modes
if (not isHideOper) or (isHideOper and sourceisOper) or \ if (not isHideOper) or (isHideOper and sourceisOper) or \
(isHideOper and not irc.botdata.get('whois_use_hideoper', True)): (isHideOper and not conf.conf['bot'].get('whois_use_hideoper', True)):
# Let's be gramatically correct. (If the opertype starts with a vowel, # Let's be gramatically correct. (If the opertype starts with a vowel,
# write "an Operator" instead of "a Operator") # write "an Operator" instead of "a Operator")
n = 'n' if user.opertype[0].lower() in 'aeiou' else '' n = 'n' if user.opertype[0].lower() in 'aeiou' else ''

View File

@ -1,5 +1,5 @@
# fantasy.py: Adds FANTASY command support, to allow calling commands in channels # fantasy.py: Adds FANTASY command support, to allow calling commands in channels
from pylinkirc import utils, world from pylinkirc import utils, world, conf
from pylinkirc.log import log from pylinkirc.log import log
def handle_fantasy(irc, source, command, args): def handle_fantasy(irc, source, command, args):
@ -9,7 +9,7 @@ def handle_fantasy(irc, source, command, args):
# Break if the IRC network isn't ready. # Break if the IRC network isn't ready.
return return
respondtonick = irc.botdata.get("respondtonick") respondtonick = conf.conf['bot'].get("respondtonick")
channel = args['target'] channel = args['target']
orig_text = args['text'] orig_text = args['text']
@ -32,8 +32,8 @@ def handle_fantasy(irc, source, command, args):
# Try to look up a prefix specific for this bot in # Try to look up a prefix specific for this bot in
# bot: prefixes: <botname>, falling back to the default prefix if not # bot: prefixes: <botname>, falling back to the default prefix if not
# specified. # specified.
prefixes = [irc.botdata.get('prefixes', {}).get(botname) or prefixes = [conf.conf['bot'].get('prefixes', {}).get(botname) or
irc.botdata.get('prefix')] conf.conf['bot'].get('prefix')]
# If responding to nick is enabled, add variations of the current nick # If responding to nick is enabled, add variations of the current nick
# to the prefix list: "<nick>," and "<nick>:" # to the prefix list: "<nick>," and "<nick>:"

View File

@ -1,6 +1,6 @@
import time import time
from pylinkirc import utils from pylinkirc import utils, conf
from pylinkirc.log import log from pylinkirc.log import log
from pylinkirc.classes import * from pylinkirc.classes import *
from pylinkirc.protocols.ts6 import * from pylinkirc.protocols.ts6 import *
@ -79,7 +79,7 @@ class HybridProtocol(TS6Protocol):
f('CAPAB :TBURST DLN KNOCK UNDLN UNKLN KLN ENCAP IE EX HOPS CHW SVS CLUSTER EOB QS') f('CAPAB :TBURST DLN KNOCK UNDLN UNKLN KLN ENCAP IE EX HOPS CHW SVS CLUSTER EOB QS')
f('SERVER %s 0 :%s' % (self.irc.serverdata["hostname"], f('SERVER %s 0 :%s' % (self.irc.serverdata["hostname"],
self.irc.serverdata.get('serverdesc') or self.irc.botdata['serverdesc'])) self.irc.serverdata.get('serverdesc') or conf.conf['bot']['serverdesc']))
# send endburst now # send endburst now
self.irc.send(':%s EOB' % (self.irc.sid,)) self.irc.send(':%s EOB' % (self.irc.sid,))
@ -101,7 +101,7 @@ class HybridProtocol(TS6Protocol):
uid = self.uidgen[server].next_uid() uid = self.uidgen[server].next_uid()
ts = ts or int(time.time()) ts = ts or int(time.time())
realname = realname or self.irc.botdata['realname'] realname = realname or conf.conf['bot']['realname']
realhost = realhost or host realhost = realhost or host
raw_modes = self.irc.joinModes(modes) raw_modes = self.irc.joinModes(modes)
u = self.irc.users[uid] = IrcUser(nick, ts, uid, server, ident=ident, host=host, realname=realname, u = self.irc.users[uid] = IrcUser(nick, ts, uid, server, ident=ident, host=host, realname=realname,

View File

@ -5,7 +5,7 @@ inspircd.py: InspIRCd 2.x protocol module for PyLink.
import time import time
import threading import threading
from pylinkirc import utils from pylinkirc import utils, conf
from pylinkirc.classes import * from pylinkirc.classes import *
from pylinkirc.log import log from pylinkirc.log import log
from pylinkirc.protocols.ts6_common import * from pylinkirc.protocols.ts6_common import *
@ -47,7 +47,7 @@ class InspIRCdProtocol(TS6BaseProtocol):
uid = self.uidgen[server].next_uid() uid = self.uidgen[server].next_uid()
ts = ts or int(time.time()) ts = ts or int(time.time())
realname = realname or self.irc.botdata['realname'] realname = realname or conf.conf['bot']['realname']
realhost = realhost or host realhost = realhost or host
raw_modes = self.irc.joinModes(modes) raw_modes = self.irc.joinModes(modes)
u = self.irc.users[uid] = IrcUser(nick, ts, uid, server, ident=ident, host=host, realname=realname, u = self.irc.users[uid] = IrcUser(nick, ts, uid, server, ident=ident, host=host, realname=realname,
@ -351,7 +351,7 @@ class InspIRCdProtocol(TS6BaseProtocol):
uplink = uplink or self.irc.sid uplink = uplink or self.irc.sid
name = name.lower() name = name.lower()
# "desc" defaults to the configured server description. # "desc" defaults to the configured server description.
desc = desc or self.irc.serverdata.get('serverdesc') or self.irc.botdata['serverdesc'] desc = desc or self.irc.serverdata.get('serverdesc') or conf.conf['bot']['serverdesc']
if sid is None: # No sid given; generate one! if sid is None: # No sid given; generate one!
sid = self.sidgen.next_sid() sid = self.sidgen.next_sid()
assert len(sid) == 3, "Incorrect SID length" assert len(sid) == 3, "Incorrect SID length"
@ -398,7 +398,7 @@ class InspIRCdProtocol(TS6BaseProtocol):
host = self.irc.serverdata["hostname"] host = self.irc.serverdata["hostname"]
f('SERVER {host} {Pass} 0 {sid} :{sdesc}'.format(host=host, f('SERVER {host} {Pass} 0 {sid} :{sdesc}'.format(host=host,
Pass=self.irc.serverdata["sendpass"], sid=self.irc.sid, Pass=self.irc.serverdata["sendpass"], sid=self.irc.sid,
sdesc=self.irc.serverdata.get('serverdesc') or self.irc.botdata['serverdesc'])) sdesc=self.irc.serverdata.get('serverdesc') or conf.conf['bot']['serverdesc']))
self._send(self.irc.sid, 'BURST %s' % ts) self._send(self.irc.sid, 'BURST %s' % ts)
# InspIRCd sends VERSION data on link, instead of whenever requested by a client. # InspIRCd sends VERSION data on link, instead of whenever requested by a client.

View File

@ -7,7 +7,7 @@ import struct
from ipaddress import ip_address from ipaddress import ip_address
import time import time
from pylinkirc import utils, structures from pylinkirc import utils, structures, conf
from pylinkirc.classes import * from pylinkirc.classes import *
from pylinkirc.log import log from pylinkirc.log import log
from pylinkirc.protocols.ircs2s_common import * from pylinkirc.protocols.ircs2s_common import *
@ -274,7 +274,7 @@ class P10Protocol(IRCS2SProtocol):
# Fill in all the values we need # Fill in all the values we need
ts = ts or int(time.time()) ts = ts or int(time.time())
realname = realname or self.irc.botdata['realname'] realname = realname or conf.conf['bot']['realname']
realhost = realhost or host realhost = realhost or host
raw_modes = self.irc.joinModes(modes) raw_modes = self.irc.joinModes(modes)
@ -642,7 +642,7 @@ class P10Protocol(IRCS2SProtocol):
# <- SERVER nefarious.midnight.vpn 1 1460673022 1460673239 J10 ABP]] +h6 :Nefarious2 test server # <- SERVER nefarious.midnight.vpn 1 1460673022 1460673239 J10 ABP]] +h6 :Nefarious2 test server
uplink = uplink or self.irc.sid uplink = uplink or self.irc.sid
name = name.lower() name = name.lower()
desc = desc or self.irc.serverdata.get('serverdesc') or self.irc.botdata['serverdesc'] desc = desc or self.irc.serverdata.get('serverdesc') or conf.conf['bot']['serverdesc']
if sid is None: # No sid given; generate one! if sid is None: # No sid given; generate one!
sid = self.sidgen.next_sid() sid = self.sidgen.next_sid()
@ -764,7 +764,7 @@ class P10Protocol(IRCS2SProtocol):
# Encode our SID using P10 Base64. # Encode our SID using P10 Base64.
self.irc.sid = sid = p10b64encode(self.irc.serverdata["sid"]) self.irc.sid = sid = p10b64encode(self.irc.serverdata["sid"])
desc = self.irc.serverdata.get('serverdesc') or self.irc.botdata['serverdesc'] desc = self.irc.serverdata.get('serverdesc') or conf.conf['bot']['serverdesc']
# Enumerate modes, from https://github.com/evilnet/nefarious2/blob/master/doc/modes.txt # Enumerate modes, from https://github.com/evilnet/nefarious2/blob/master/doc/modes.txt
cmodes = {'op': 'o', 'voice': 'v', 'private': 'p', 'secret': 's', 'moderated': 'm', cmodes = {'op': 'o', 'voice': 'v', 'private': 'p', 'secret': 's', 'moderated': 'm',

View File

@ -1,6 +1,6 @@
import time import time
from pylinkirc import utils from pylinkirc import utils, conf
from pylinkirc.log import log from pylinkirc.log import log
from pylinkirc.classes import * from pylinkirc.classes import *
from pylinkirc.protocols.ts6 import * from pylinkirc.protocols.ts6 import *
@ -58,7 +58,7 @@ class RatboxProtocol(TS6Protocol):
uid = self.uidgen[server].next_uid() uid = self.uidgen[server].next_uid()
ts = ts or int(time.time()) ts = ts or int(time.time())
realname = realname or self.irc.botdata['realname'] realname = realname or conf.conf['bot']['realname']
raw_modes = self.irc.joinModes(modes) raw_modes = self.irc.joinModes(modes)
orig_realhost = realhost orig_realhost = realhost

View File

@ -5,7 +5,7 @@ ts6.py: PyLink protocol module for TS6-based IRCds (charybdis, elemental-ircd).
import time import time
import re import re
from pylinkirc import utils from pylinkirc import utils, conf
from pylinkirc.classes import * from pylinkirc.classes import *
from pylinkirc.log import log from pylinkirc.log import log
from pylinkirc.protocols.ts6_common import * from pylinkirc.protocols.ts6_common import *
@ -46,7 +46,7 @@ class TS6Protocol(TS6BaseProtocol):
# parameters: nickname, hopcount, nickTS, umodes, username, # parameters: nickname, hopcount, nickTS, umodes, username,
# visible hostname, IP address, UID, real hostname, account name, gecos # visible hostname, IP address, UID, real hostname, account name, gecos
ts = ts or int(time.time()) ts = ts or int(time.time())
realname = realname or self.irc.botdata['realname'] realname = realname or conf.conf['bot']['realname']
realhost = realhost or host realhost = realhost or host
raw_modes = self.irc.joinModes(modes) raw_modes = self.irc.joinModes(modes)
u = self.irc.users[uid] = IrcUser(nick, ts, uid, server, ident=ident, host=host, realname=realname, u = self.irc.users[uid] = IrcUser(nick, ts, uid, server, ident=ident, host=host, realname=realname,
@ -338,7 +338,7 @@ class TS6Protocol(TS6BaseProtocol):
f('CAPAB :QS ENCAP EX CHW IE KNOCK SAVE SERVICES TB EUID RSFNC EOPMOD SAVETS_100') f('CAPAB :QS ENCAP EX CHW IE KNOCK SAVE SERVICES TB EUID RSFNC EOPMOD SAVETS_100')
f('SERVER %s 0 :%s' % (self.irc.serverdata["hostname"], f('SERVER %s 0 :%s' % (self.irc.serverdata["hostname"],
self.irc.serverdata.get('serverdesc') or self.irc.botdata['serverdesc'])) self.irc.serverdata.get('serverdesc') or conf.conf['bot']['serverdesc']))
# Finally, end all the initialization with a PING - that's Charybdis' # Finally, end all the initialization with a PING - that's Charybdis'
# way of saying end-of-burst :) # way of saying end-of-burst :)

View File

@ -5,7 +5,7 @@ ts6_common.py: Common base protocol class with functions shared by the UnrealIRC
import string import string
import time import time
from pylinkirc import utils, structures from pylinkirc import utils, structures, conf
from pylinkirc.classes import * from pylinkirc.classes import *
from pylinkirc.log import log from pylinkirc.log import log
from pylinkirc.protocols.ircs2s_common import * from pylinkirc.protocols.ircs2s_common import *
@ -260,7 +260,7 @@ class TS6BaseProtocol(IRCS2SProtocol):
# -> :0AL SID test.server 1 0XY :some silly pseudoserver # -> :0AL SID test.server 1 0XY :some silly pseudoserver
uplink = uplink or self.irc.sid uplink = uplink or self.irc.sid
name = name.lower() name = name.lower()
desc = desc or self.irc.serverdata.get('serverdesc') or self.irc.botdata['serverdesc'] desc = desc or self.irc.serverdata.get('serverdesc') or conf.conf['bot']['serverdesc']
if sid is None: # No sid given; generate one! if sid is None: # No sid given; generate one!
sid = self.sidgen.next_sid() sid = self.sidgen.next_sid()
assert len(sid) == 3, "Incorrect SID length" assert len(sid) == 3, "Incorrect SID length"

View File

@ -7,7 +7,7 @@ import codecs
import socket import socket
import re import re
from pylinkirc import utils from pylinkirc import utils, conf
from pylinkirc.classes import * from pylinkirc.classes import *
from pylinkirc.log import log from pylinkirc.log import log
from pylinkirc.protocols.ts6_common import * from pylinkirc.protocols.ts6_common import *
@ -73,7 +73,7 @@ class UnrealProtocol(TS6BaseProtocol):
uid = self.uidgen[server].next_uid() uid = self.uidgen[server].next_uid()
ts = ts or int(time.time()) ts = ts or int(time.time())
realname = realname or self.irc.botdata['realname'] realname = realname or conf.conf['bot']['realname']
realhost = realhost or host realhost = realhost or host
# Add +xt so that vHost cloaking always works. # Add +xt so that vHost cloaking always works.
@ -367,7 +367,7 @@ class UnrealProtocol(TS6BaseProtocol):
# ESVID - Supports account names in services stamps instead of just the signon time. # ESVID - Supports account names in services stamps instead of just the signon time.
# AFAIK this doesn't actually affect services' behaviour? # AFAIK this doesn't actually affect services' behaviour?
f('PROTOCTL SJOIN SJ3 NOQUIT NICKv2 VL UMODE2 PROTOCTL NICKIP EAUTH=%s SID=%s VHP ESVID' % (self.irc.serverdata["hostname"], self.irc.sid)) f('PROTOCTL SJOIN SJ3 NOQUIT NICKv2 VL UMODE2 PROTOCTL NICKIP EAUTH=%s SID=%s VHP ESVID' % (self.irc.serverdata["hostname"], self.irc.sid))
sdesc = self.irc.serverdata.get('serverdesc') or self.irc.botdata['serverdesc'] sdesc = self.irc.serverdata.get('serverdesc') or conf.conf['bot']['serverdesc']
f('SERVER %s 1 U%s-h6e-%s :%s' % (host, self.proto_ver, self.irc.sid, sdesc)) f('SERVER %s 1 U%s-h6e-%s :%s' % (host, self.proto_ver, self.irc.sid, sdesc))
f('NETINFO 1 %s %s * 0 0 0 :%s' % (self.irc.start_ts, self.proto_ver, self.irc.serverdata.get("netname", self.irc.name))) f('NETINFO 1 %s %s * 0 0 0 :%s' % (self.irc.start_ts, self.proto_ver, self.irc.serverdata.get("netname", self.irc.name)))
self._send(self.irc.sid, 'EOS') self._send(self.irc.sid, 'EOS')

View File

@ -560,3 +560,17 @@ class IRCParser(argparse.ArgumentParser):
def error(self, message): def error(self, message):
raise InvalidArgumentsError(message) raise InvalidArgumentsError(message)
class DeprecatedAttributesObject():
"""
Object implementing deprecated attributes and warnings on access.
"""
def __getattribute__(self, attr):
# Note: "self.deprecated_attributes" calls this too, so the != check is
# needed to prevent a recursive loop!
if attr != 'deprecated_attributes' and attr in self.deprecated_attributes:
log.warning('Attribute %s.%s is deprecated: %s' % (self.__class__.__name__, attr,
self.deprecated_attributes.get(attr)))
return object.__getattribute__(self, attr)