mirror of https://github.com/jesopo/ircstates
pull server from WHO and WHOX
This commit is contained in:
parent
01d8b8d111
commit
9806a6407b
|
@ -21,7 +21,7 @@ class ServerException(Exception):
|
||||||
class ServerDisconnectedException(ServerException):
|
class ServerDisconnectedException(ServerException):
|
||||||
pass
|
pass
|
||||||
|
|
||||||
WHO_TYPE = "937" # randomly generated
|
WHO_TYPE = "735" # randomly generated
|
||||||
TYPE_EMIT = Optional[Emit]
|
TYPE_EMIT = Optional[Emit]
|
||||||
|
|
||||||
class Server(object):
|
class Server(object):
|
||||||
|
@ -34,6 +34,7 @@ class Server(object):
|
||||||
self.hostname: Optional[str] = None
|
self.hostname: Optional[str] = None
|
||||||
self.realname: Optional[str] = None
|
self.realname: Optional[str] = None
|
||||||
self.account: Optional[str] = None
|
self.account: Optional[str] = None
|
||||||
|
self.server: Optional[str] = None
|
||||||
self.away: Optional[str] = None
|
self.away: Optional[str] = None
|
||||||
|
|
||||||
self.registered = False
|
self.registered = False
|
||||||
|
@ -111,7 +112,7 @@ class Server(object):
|
||||||
return channel_user
|
return channel_user
|
||||||
|
|
||||||
def prepare_whox(self, target: str) -> Line:
|
def prepare_whox(self, target: str) -> Line:
|
||||||
return build("WHO", [target, f"n%afhinrtu,{WHO_TYPE}"])
|
return build("WHO", [target, f"n%afhinrstu,{WHO_TYPE}"])
|
||||||
|
|
||||||
def _self_hostmask(self, hostmask: Hostmask):
|
def _self_hostmask(self, hostmask: Hostmask):
|
||||||
self.nickname = hostmask.nickname
|
self.nickname = hostmask.nickname
|
||||||
|
@ -582,12 +583,17 @@ class Server(object):
|
||||||
away = "" if "G" in status else None
|
away = "" if "G" in status else None
|
||||||
realname = line.params[7].split(" ", 1)[1]
|
realname = line.params[7].split(" ", 1)[1]
|
||||||
|
|
||||||
|
server: Optional[str] = None
|
||||||
|
if not line.params[4] == "*":
|
||||||
|
server = line.params[4]
|
||||||
|
|
||||||
nickname_lower = self.casefold(line.params[5])
|
nickname_lower = self.casefold(line.params[5])
|
||||||
if nickname_lower == self.nickname_lower:
|
if nickname_lower == self.nickname_lower:
|
||||||
emit.self = True
|
emit.self = True
|
||||||
self.username = username
|
self.username = username
|
||||||
self.hostname = hostname
|
self.hostname = hostname
|
||||||
self.realname = realname
|
self.realname = realname
|
||||||
|
self.server = server
|
||||||
self.away = away
|
self.away = away
|
||||||
|
|
||||||
if nickname_lower in self.users:
|
if nickname_lower in self.users:
|
||||||
|
@ -596,6 +602,7 @@ class Server(object):
|
||||||
user.username = username
|
user.username = username
|
||||||
user.hostname = hostname
|
user.hostname = hostname
|
||||||
user.realname = realname
|
user.realname = realname
|
||||||
|
user.server = server
|
||||||
user.away = away
|
user.away = away
|
||||||
return emit
|
return emit
|
||||||
|
|
||||||
|
@ -603,17 +610,20 @@ class Server(object):
|
||||||
# WHOX line, "WHO #channel|nickname" response; only listen for our "type"
|
# WHOX line, "WHO #channel|nickname" response; only listen for our "type"
|
||||||
def _handle_whox(self, line: Line) -> Emit:
|
def _handle_whox(self, line: Line) -> Emit:
|
||||||
emit = self._emit()
|
emit = self._emit()
|
||||||
if line.params[1] == WHO_TYPE and len(line.params) == 9:
|
if line.params[1] == WHO_TYPE and len(line.params) == 10:
|
||||||
nickname_lower = self.casefold(line.params[5])
|
nickname_lower = self.casefold(line.params[6])
|
||||||
username = line.params[2]
|
username = line.params[2]
|
||||||
hostname = line.params[4]
|
hostname = line.params[4]
|
||||||
status = line.params[6]
|
status = line.params[7]
|
||||||
away = "" if "G" in status else None
|
away = "" if "G" in status else None
|
||||||
realname = line.params[8]
|
realname = line.params[9]
|
||||||
|
|
||||||
account: Optional[str] = None
|
account: Optional[str] = None
|
||||||
if not line.params[7] == "0":
|
if not line.params[8] == "0":
|
||||||
account = line.params[7]
|
account = line.params[8]
|
||||||
|
server: Optional[str] = None
|
||||||
|
if not line.params[5] == "*":
|
||||||
|
server = line.params[5]
|
||||||
|
|
||||||
if nickname_lower in self.users:
|
if nickname_lower in self.users:
|
||||||
user = self.users[nickname_lower]
|
user = self.users[nickname_lower]
|
||||||
|
@ -622,6 +632,7 @@ class Server(object):
|
||||||
user.hostname = hostname
|
user.hostname = hostname
|
||||||
user.realname = realname
|
user.realname = realname
|
||||||
user.account = account
|
user.account = account
|
||||||
|
user.server = server
|
||||||
user.away = away
|
user.away = away
|
||||||
|
|
||||||
if nickname_lower == self.nickname_lower:
|
if nickname_lower == self.nickname_lower:
|
||||||
|
@ -630,6 +641,7 @@ class Server(object):
|
||||||
self.hostname = hostname
|
self.hostname = hostname
|
||||||
self.realname = realname
|
self.realname = realname
|
||||||
self.account = account
|
self.account = account
|
||||||
|
self.server = server
|
||||||
self.away = away
|
self.away = away
|
||||||
|
|
||||||
return emit
|
return emit
|
||||||
|
|
|
@ -9,6 +9,7 @@ class User(object):
|
||||||
self.hostname: Optional[str] = None
|
self.hostname: Optional[str] = None
|
||||||
self.realname: Optional[str] = None
|
self.realname: Optional[str] = None
|
||||||
self.account: Optional[str] = None
|
self.account: Optional[str] = None
|
||||||
|
self.server: Optional[str] = None
|
||||||
self.away: Optional[str] = None
|
self.away: Optional[str] = None
|
||||||
self.channels: Set[str] = set([])
|
self.channels: Set[str] = set([])
|
||||||
|
|
||||||
|
|
15
test/who.py
15
test/who.py
|
@ -14,11 +14,13 @@ class WHOTest(unittest.TestCase):
|
||||||
self.assertEqual(user.username, "user")
|
self.assertEqual(user.username, "user")
|
||||||
self.assertEqual(user.hostname, "host")
|
self.assertEqual(user.hostname, "host")
|
||||||
self.assertEqual(user.realname, "real")
|
self.assertEqual(user.realname, "real")
|
||||||
|
self.assertEqual(user.server, "server")
|
||||||
self.assertIsNone(user.away)
|
self.assertIsNone(user.away)
|
||||||
|
|
||||||
self.assertEqual(server.username, user.username)
|
self.assertEqual(server.username, user.username)
|
||||||
self.assertEqual(server.hostname, user.hostname)
|
self.assertEqual(server.hostname, user.hostname)
|
||||||
self.assertEqual(server.realname, user.realname)
|
self.assertEqual(server.realname, user.realname)
|
||||||
|
self.assertEqual(server.server, user.server)
|
||||||
self.assertIsNone(server.away)
|
self.assertIsNone(server.away)
|
||||||
|
|
||||||
server.parse_tokens(irctokens.tokenise(
|
server.parse_tokens(irctokens.tokenise(
|
||||||
|
@ -32,22 +34,24 @@ class WHOTest(unittest.TestCase):
|
||||||
server.parse_tokens(irctokens.tokenise(":nickname JOIN #chan"))
|
server.parse_tokens(irctokens.tokenise(":nickname JOIN #chan"))
|
||||||
user = server.users["nickname"]
|
user = server.users["nickname"]
|
||||||
server.parse_tokens(irctokens.tokenise(
|
server.parse_tokens(irctokens.tokenise(
|
||||||
f"354 * {WHO_TYPE} user realip host nickname * account :real"))
|
f"354 * {WHO_TYPE} user realip host server nickname * account :real"))
|
||||||
|
|
||||||
self.assertEqual(user.username, "user")
|
self.assertEqual(user.username, "user")
|
||||||
self.assertEqual(user.hostname, "host")
|
self.assertEqual(user.hostname, "host")
|
||||||
self.assertEqual(user.realname, "real")
|
self.assertEqual(user.realname, "real")
|
||||||
self.assertEqual(user.account, "account")
|
self.assertEqual(user.account, "account")
|
||||||
|
self.assertEqual(user.server, "server")
|
||||||
self.assertIsNone(user.away)
|
self.assertIsNone(user.away)
|
||||||
|
|
||||||
self.assertEqual(server.username, user.username)
|
self.assertEqual(server.username, user.username)
|
||||||
self.assertEqual(server.hostname, user.hostname)
|
self.assertEqual(server.hostname, user.hostname)
|
||||||
self.assertEqual(server.realname, user.realname)
|
self.assertEqual(server.realname, user.realname)
|
||||||
self.assertEqual(server.account, user.account)
|
self.assertEqual(server.account, user.account)
|
||||||
|
self.assertEqual(server.server, user.server)
|
||||||
self.assertIsNone(server.away)
|
self.assertIsNone(server.away)
|
||||||
|
|
||||||
server.parse_tokens(irctokens.tokenise(
|
server.parse_tokens(irctokens.tokenise(
|
||||||
f"354 * {WHO_TYPE} user realip host nickname G account :real"))
|
f"354 * {WHO_TYPE} user realip host server nickname G account :real"))
|
||||||
self.assertEqual(user.away, "")
|
self.assertEqual(user.away, "")
|
||||||
self.assertEqual(server.away, "")
|
self.assertEqual(server.away, "")
|
||||||
|
|
||||||
|
@ -55,8 +59,13 @@ class WHOTest(unittest.TestCase):
|
||||||
server = ircstates.Server("test")
|
server = ircstates.Server("test")
|
||||||
server.parse_tokens(irctokens.tokenise("001 nickname"))
|
server.parse_tokens(irctokens.tokenise("001 nickname"))
|
||||||
server.parse_tokens(irctokens.tokenise(":nickname JOIN #chan"))
|
server.parse_tokens(irctokens.tokenise(":nickname JOIN #chan"))
|
||||||
|
|
||||||
|
user = server.users["nickname"]
|
||||||
|
user.account = "account"
|
||||||
|
server.account = "account"
|
||||||
|
|
||||||
server.parse_tokens(irctokens.tokenise(
|
server.parse_tokens(irctokens.tokenise(
|
||||||
f"354 * {WHO_TYPE} user realip host nickname 0 :real"))
|
f"354 * {WHO_TYPE} user realip host server nickname * 0 :real"))
|
||||||
user = server.users["nickname"]
|
user = server.users["nickname"]
|
||||||
|
|
||||||
self.assertEqual(user.account, None)
|
self.assertEqual(user.account, None)
|
||||||
|
|
Loading…
Reference in New Issue