From: Christian Heller Date: Tue, 25 Nov 2025 12:09:02 +0000 (+0100) Subject: Simplify setting of Client.db.message. X-Git-Url: https://plomlompom.com/repos/task?a=commitdiff_plain;h=f52e7b62286388432c599c1dd2fa231521e3618c;p=ircplom Simplify setting of Client.db.message. --- diff --git a/src/ircplom/client.py b/src/ircplom/client.py index 90ebeca..420b67f 100644 --- a/src/ircplom/client.py +++ b/src/ircplom/client.py @@ -7,7 +7,7 @@ from getpass import getuser from re import search as re_search, IGNORECASE as re_IGNORECASE from threading import Thread from time import sleep -from typing import Any, Callable, Iterable, Optional, Self +from typing import Any, Callable, Iterable, Optional from uuid import UUID, uuid4 # ourselves from ircplom.db_primitives import ( @@ -66,6 +66,7 @@ class IrcConnSetup: password: str = '' +@dataclass class ChatMessage: 'Collects all we want to know on incoming PRIVMSG or NOTICE chat message.' content: str = '' @@ -238,32 +239,6 @@ class _Channel(Channel): self._remove_membership_prefix(user_id, prefix) -class _ChatMessage(ChatMessage): - - def __init__(self, - sender: str | NickUserHost = '', - db: Optional['_ClientDb'] = None - ) -> None: - self.sender = sender if isinstance(sender, str) else sender.nick - self._db = db - - def to(self, target: str) -> Self: - 'Extend self with .target, return self.' - self.target = target - return self - - def __setattr__(self, key: str, value: str) -> None: - if key in {'privmsg', 'notice'}: - assert self._db is not None - self.is_notice = key == 'notice' - self.content = value - self._db.message = self - # to clean update cache, enabling equal messages in direct sequence - self._db.message = ChatMessage() - else: - super().__setattr__(key, value) - - class _SetNickuserhostMixin: def __setattr__(self, key: str, value: NickUserHost | str) -> None: @@ -498,9 +473,35 @@ class _ClientDb(Clearable, UpdatingAttrsMixin, SharedClientDbFields): del self.channels[channel] self.users.purge() - def messaging(self, src: str | NickUserHost) -> ChatMessage: - 'Start input chain for chat message data.' - return _ChatMessage(sender=src, db=self) + def _set_message(self, + content: str, + sender: str | NickUserHost, + target: str, + is_notice: bool + ) -> None: + self.message = ChatMessage( + content, + sender if isinstance(sender, str) else sender.nick, + target, + is_notice) + # to clean update cache, enabling equal messages in direct sequence + self.message = ChatMessage() + + def notice(self, + content: str, + sender: str | NickUserHost = '', + target: str = '' + ) -> None: + 'Set .message from NOTICE.' + self._set_message(content, sender, target, is_notice=True) + + def privmsg(self, + content: str, + sender: str | NickUserHost, + target: str = '' + ) -> None: + 'Set .message from PRIVMSG.' + self._set_message(content, sender, target, is_notice=False) def into_endnode_updates(self, path: tuple[str, ...] ) -> list[tuple[tuple[str, ...], Any]]: diff --git a/src/ircplom/client_tui.py b/src/ircplom/client_tui.py index 04e90a2..6aa3558 100644 --- a/src/ircplom/client_tui.py +++ b/src/ircplom/client_tui.py @@ -527,7 +527,7 @@ class ClientKnowingTui(Client): and chat_target not in self.db.channels.keys(): self._tui_alert_trigger('not sending, since not in channel') elif self.send('PRIVMSG', chat_target, msg): - self.db.messaging('').to(chat_target).privmsg = msg # type: ignore + self.db.privmsg(msg, sender='', target=chat_target) def cmd__disconnect(self, quit_msg: str) -> None: 'Send QUIT if connected, else end auto-connect attempts.' diff --git a/src/ircplom/msg_parse_expectations.py b/src/ircplom/msg_parse_expectations.py index de8c036..cdda2fa 100644 --- a/src/ircplom/msg_parse_expectations.py +++ b/src/ircplom/msg_parse_expectations.py @@ -521,41 +521,48 @@ MSG_EXPECTATIONS: list[_MsgParseExpectation] = [ 'NOTICE', _MsgToken.SERVER, ('*', - (_MsgToken.ANY, 'setattr_db.messaging..to.:notice'))), + (_MsgToken.ANY, ':content')), + bonus_tasks=('do_db.notice:content',)), _MsgParseExpectation( 'NOTICE', _MsgToken.SERVER, ((_MsgToken.NICKNAME, 'setattr_db.users.me:nick'), - (_MsgToken.ANY, 'setattr_db.messaging..to.:notice'))), + (_MsgToken.ANY, ':content')), + bonus_tasks=('do_db.notice:content',)), _MsgParseExpectation( 'NOTICE', - (_MsgToken.SERVER, ':SERVER'), - ((_MsgToken.CHANNEL, ':CHANNEL'), - (_MsgToken.ANY, 'setattr_db.messaging.SERVER.to.CHANNEL:notice'))), + (_MsgToken.SERVER, ':sender'), + ((_MsgToken.CHANNEL, ':target'), + (_MsgToken.ANY, ':content')), + bonus_tasks=('do_db.notice:content,sender,target',)), _MsgParseExpectation( 'NOTICE', - (_MsgToken.NICK_USER_HOST, ':USER'), - ((_MsgToken.NICKNAME, 'setattr_db.users.me:nick'), - (_MsgToken.ANY, 'setattr_db.messaging.USER.to.:notice'))), + (_MsgToken.NICK_USER_HOST, ':sender'), + ((_MsgToken.NICKNAME, 'setattr_db.users.me:target'), + (_MsgToken.ANY, ':content')), + bonus_tasks=('do_db.notice:content,sender',)), _MsgParseExpectation( 'NOTICE', - (_MsgToken.NICK_USER_HOST, ':USER'), - ((_MsgToken.CHANNEL, ':CHANNEL'), - (_MsgToken.ANY, 'setattr_db.messaging.USER.to.CHANNEL:notice'))), + (_MsgToken.NICK_USER_HOST, ':sender'), + ((_MsgToken.CHANNEL, ':target'), + (_MsgToken.ANY, ':content')), + bonus_tasks=('do_db.notice:content,sender,target',)), _MsgParseExpectation( 'PRIVMSG', - (_MsgToken.NICK_USER_HOST, ':USER'), - ((_MsgToken.NICKNAME, 'setattr_db.users.me:nick'), - (_MsgToken.ANY, 'setattr_db.messaging.USER.to.:privmsg'))), + (_MsgToken.NICK_USER_HOST, ':sender'), + ((_MsgToken.NICKNAME, 'setattr_db.users.me:target'), + (_MsgToken.ANY, ':content')), + bonus_tasks=('do_db.privmsg:content,sender',)), _MsgParseExpectation( 'PRIVMSG', - (_MsgToken.NICK_USER_HOST, ':USER'), - ((_MsgToken.CHANNEL, ':CHANNEL'), - (_MsgToken.ANY, 'setattr_db.messaging.USER.to.CHANNEL:privmsg'))), + (_MsgToken.NICK_USER_HOST, ':sender'), + ((_MsgToken.CHANNEL, ':target'), + (_MsgToken.ANY, ':content')), + bonus_tasks=('do_db.privmsg:content,sender,target',)), # connection state