mirror of
https://github.com/jlu5/PyLink.git
synced 2025-01-26 12:14:24 +01:00
protocols: handle usermode-based away (i.e. ngircd +a)
This commit is contained in:
parent
b2b50371ab
commit
085b4cacbe
@ -551,6 +551,19 @@ class IRCS2SProtocol(IRCCommonProtocol):
|
|||||||
def _check_cloak_change(self, uid):
|
def _check_cloak_change(self, uid):
|
||||||
return
|
return
|
||||||
|
|
||||||
|
def _check_umode_away_change(self, uid):
|
||||||
|
# Handle away status changes based on umode +a
|
||||||
|
awaymode = self.umodes.get('away')
|
||||||
|
if uid in self.users and awaymode:
|
||||||
|
u = self.users[uid]
|
||||||
|
old_away_status = u.away
|
||||||
|
|
||||||
|
# Check whether the user is marked away, and send a hook update only if the status has changed.
|
||||||
|
away_status = (awaymode, None) in u.modes
|
||||||
|
if away_status != old_away_status:
|
||||||
|
# This sets a dummy away reason of "Away" because no actual text is provided.
|
||||||
|
self.call_hooks([uid, 'AWAY', {'text': 'Away'}])
|
||||||
|
|
||||||
def handle_mode(self, source, command, args):
|
def handle_mode(self, source, command, args):
|
||||||
"""Handles mode changes."""
|
"""Handles mode changes."""
|
||||||
# InspIRCd:
|
# InspIRCd:
|
||||||
@ -577,8 +590,9 @@ class IRCS2SProtocol(IRCCommonProtocol):
|
|||||||
self.call_hooks([target, 'CLIENT_OPERED', {'text': 'IRC Operator'}])
|
self.call_hooks([target, 'CLIENT_OPERED', {'text': 'IRC Operator'}])
|
||||||
|
|
||||||
if target in self.users:
|
if target in self.users:
|
||||||
# Target was a user. Check for any cloak changes.
|
# Target was a user. Check for any cloak and away status changes.
|
||||||
self._check_cloak_change(target)
|
self._check_cloak_change(target)
|
||||||
|
self._check_umode_away_change(target)
|
||||||
|
|
||||||
return {'target': target, 'modes': changedmodes, 'channeldata': channeldata}
|
return {'target': target, 'modes': changedmodes, 'channeldata': channeldata}
|
||||||
|
|
||||||
|
@ -128,6 +128,21 @@ class NgIRCdProtocol(IRCS2SProtocol):
|
|||||||
self.servers[sid] = Server(uplink, name, internal=True, desc=desc)
|
self.servers[sid] = Server(uplink, name, internal=True, desc=desc)
|
||||||
return sid
|
return sid
|
||||||
|
|
||||||
|
def away(self, source, text):
|
||||||
|
"""Sends an AWAY message from a PyLink client. If the text is empty, away status is unset."""
|
||||||
|
if not self.is_internal_client(source):
|
||||||
|
raise LookupError('No such PyLink client exists.')
|
||||||
|
|
||||||
|
# Away status is denoted on ngIRCd with umode +a.
|
||||||
|
modes = self.users[source].modes
|
||||||
|
if text and (('a', None) not in modes):
|
||||||
|
# Set umode +a if it isn't already set
|
||||||
|
self.mode(source, source, [('+a', None)])
|
||||||
|
elif ('a', None) in modes:
|
||||||
|
# Ditto, only unset the mode if it *was* set.
|
||||||
|
self.mode(source, source, [('-a', None)])
|
||||||
|
self.users[source].away = text
|
||||||
|
|
||||||
def join(self, client, channel):
|
def join(self, client, channel):
|
||||||
channel = self.to_lower(channel)
|
channel = self.to_lower(channel)
|
||||||
|
|
||||||
@ -325,6 +340,9 @@ class NgIRCdProtocol(IRCS2SProtocol):
|
|||||||
# Add the nick to the list of users on its server; this is used for SQUIT tracking
|
# Add the nick to the list of users on its server; this is used for SQUIT tracking
|
||||||
self.servers[source].users.add(uid)
|
self.servers[source].users.add(uid)
|
||||||
|
|
||||||
|
# Check away status changes (TODO: implement cloak handling too)
|
||||||
|
self._check_umode_away_change(uid)
|
||||||
|
|
||||||
return {'uid': uid, 'ts': ts, 'nick': nick, 'realhost': host, 'host': host, 'ident': ident,
|
return {'uid': uid, 'ts': ts, 'nick': nick, 'realhost': host, 'host': host, 'ident': ident,
|
||||||
'parse_as': 'UID', 'ip': '0.0.0.0'}
|
'parse_as': 'UID', 'ip': '0.0.0.0'}
|
||||||
else:
|
else:
|
||||||
|
Loading…
Reference in New Issue
Block a user