Make line parser reuseable (and make it work for client & server lines)
This commit is contained in:
parent
3cd61f6ce1
commit
6be2d92bac
|
@ -132,3 +132,43 @@ def load(filepath):
|
||||||
return json_load(f)
|
return json_load(f)
|
||||||
else:
|
else:
|
||||||
raise Exception("Unknown config format")
|
raise Exception("Unknown config format")
|
||||||
|
|
||||||
|
|
||||||
|
def parse_irc_line(data, client=True):
|
||||||
|
"""
|
||||||
|
Process one line of text irc sent us.
|
||||||
|
|
||||||
|
Return tuple of (command, args, prefix, trailing)
|
||||||
|
|
||||||
|
:param data: the data to process
|
||||||
|
:type data: str
|
||||||
|
:return tuple:"""
|
||||||
|
if data.strip() == "":
|
||||||
|
return
|
||||||
|
|
||||||
|
prefix = None
|
||||||
|
command = None
|
||||||
|
args = []
|
||||||
|
trailing = None
|
||||||
|
|
||||||
|
if data[0] == ":":
|
||||||
|
prefix = data.split(" ")[0][1:]
|
||||||
|
data = data[data.find(" ") + 1:]
|
||||||
|
command = data.split(" ")[0]
|
||||||
|
data = data[data.find(" ") + 1:]
|
||||||
|
if(data[0] == ":"):
|
||||||
|
# no args
|
||||||
|
trailing = data[1:].strip()
|
||||||
|
else:
|
||||||
|
# find trailing
|
||||||
|
pos = data.find(" :")
|
||||||
|
if pos == -1:
|
||||||
|
trailing = None
|
||||||
|
else:
|
||||||
|
trailing = data[pos + 2:].strip()
|
||||||
|
data = data[:data.find(" :")]
|
||||||
|
args = data.split(" ")
|
||||||
|
for index, arg in enumerate(args):
|
||||||
|
args[index] = arg.strip()
|
||||||
|
|
||||||
|
return (command, args, prefix, trailing)
|
||||||
|
|
|
@ -12,7 +12,7 @@ import logging
|
||||||
import traceback
|
import traceback
|
||||||
import sys
|
import sys
|
||||||
from inspect import getargspec
|
from inspect import getargspec
|
||||||
from pyircbot.common import burstbucket
|
from pyircbot.common import burstbucket, parse_irc_line
|
||||||
from collections import namedtuple
|
from collections import namedtuple
|
||||||
from io import StringIO
|
from io import StringIO
|
||||||
|
|
||||||
|
@ -81,12 +81,17 @@ class IRCCore(object):
|
||||||
self.server = (self.server + 1) % len(self.servers)
|
self.server = (self.server + 1) % len(self.servers)
|
||||||
await asyncio.sleep(1, loop=loop)
|
await asyncio.sleep(1, loop=loop)
|
||||||
continue
|
continue
|
||||||
|
|
||||||
while self.alive:
|
while self.alive:
|
||||||
try:
|
try:
|
||||||
data = await self.reader.readuntil()
|
data = await self.reader.readuntil()
|
||||||
self.log.debug("<<< {}".format(repr(data)))
|
self.log.debug("<<< {}".format(repr(data)))
|
||||||
self.process_line(data.decode("UTF-8"))
|
command, args, prefix, trailing = parse_irc_line(data.decode("UTF-8"))
|
||||||
|
self.fire_hook("_RECV", args=args, prefix=prefix, trailing=trailing)
|
||||||
|
if command not in self.hookcalls:
|
||||||
|
self.log.warning("Unknown command: cmd='{}' prefix='{}' args='{}' trailing='{}'"
|
||||||
|
.format(command, prefix, args, trailing))
|
||||||
|
else:
|
||||||
|
self.fire_hook(command, args=args, prefix=prefix, trailing=trailing)
|
||||||
except (ConnectionResetError, asyncio.streams.IncompleteReadError):
|
except (ConnectionResetError, asyncio.streams.IncompleteReadError):
|
||||||
traceback.print_exc()
|
traceback.print_exc()
|
||||||
break
|
break
|
||||||
|
@ -132,41 +137,6 @@ class IRCCore(object):
|
||||||
self.writer.close()
|
self.writer.close()
|
||||||
self.log.info("Kill complete")
|
self.log.info("Kill complete")
|
||||||
|
|
||||||
def process_line(self, data):
|
|
||||||
"""Process one line of text irc sent us
|
|
||||||
|
|
||||||
:param data: the data to process
|
|
||||||
:type data: str"""
|
|
||||||
if data.strip() == "":
|
|
||||||
return
|
|
||||||
|
|
||||||
prefix = None
|
|
||||||
command = None
|
|
||||||
args = []
|
|
||||||
trailing = None
|
|
||||||
|
|
||||||
if data[0] == ":":
|
|
||||||
prefix = data.split(" ")[0][1:]
|
|
||||||
data = data[data.find(" ") + 1:]
|
|
||||||
command = data.split(" ")[0]
|
|
||||||
data = data[data.find(" ") + 1:]
|
|
||||||
if(data[0] == ":"):
|
|
||||||
# no args
|
|
||||||
trailing = data[1:].strip()
|
|
||||||
else:
|
|
||||||
trailing = data[data.find(" :") + 2:].strip()
|
|
||||||
data = data[:data.find(" :")]
|
|
||||||
args = data.split(" ")
|
|
||||||
for index, arg in enumerate(args):
|
|
||||||
args[index] = arg.strip()
|
|
||||||
|
|
||||||
self.fire_hook("_RECV", args=args, prefix=prefix, trailing=trailing)
|
|
||||||
if command not in self.hookcalls:
|
|
||||||
self.log.warning("Unknown command: cmd='%s' prefix='%s' args='%s' trailing='%s'" % (command, prefix, args,
|
|
||||||
trailing))
|
|
||||||
else:
|
|
||||||
self.fire_hook(command, args=args, prefix=prefix, trailing=trailing)
|
|
||||||
|
|
||||||
def sendRaw(self, data):
|
def sendRaw(self, data):
|
||||||
asyncio.run_coroutine_threadsafe(self.outputq.put((5, data, )), self._loop)
|
asyncio.run_coroutine_threadsafe(self.outputq.put((5, data, )), self._loop)
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue