diff --git a/include/znc/Message.h b/include/znc/Message.h index d2e0bf93..8bf2fad5 100644 --- a/include/znc/Message.h +++ b/include/znc/Message.h @@ -103,6 +103,7 @@ public: void Parse(CString sMessage); // Implicit and explicit conversion to a subclass reference. +#ifndef SWIG template M& As() & { static_assert(sizeof(M) == sizeof(CMessage), "No data members allowed in CMessage subclasses."); @@ -123,6 +124,12 @@ public: operator const M&() const & { return As(); } + // REGISTER_ZNC_MESSAGE allows SWIG to instantiate correct .As<> calls. +#define REGISTER_ZNC_MESSAGE(M) +#else + // SWIG doesn't parse ref-qualifiers, and doesn't differentiate constness. + template M& As(); +#endif private: void InitTime(); @@ -148,12 +155,14 @@ public: CString GetTarget() const { return GetParam(0); } void SetTarget(const CString& sTarget) { SetParam(0, sTarget); } }; +REGISTER_ZNC_MESSAGE(CTargetMessage); class CActionMessage : public CTargetMessage { public: CString GetText() const { return GetParam(1).TrimPrefix_n("\001ACTION ").TrimSuffix_n("\001"); } void SetText(const CString& sText) { SetParam(1, "\001ACTION " + sText + "\001"); } }; +REGISTER_ZNC_MESSAGE(CActionMessage); class CCTCPMessage : public CTargetMessage { public: @@ -161,17 +170,20 @@ public: CString GetText() const { return GetParam(1).TrimPrefix_n("\001").TrimSuffix_n("\001"); } void SetText(const CString& sText) { SetParam(1, "\001" + sText + "\001"); } }; +REGISTER_ZNC_MESSAGE(CCTCPMessage); class CJoinMessage : public CTargetMessage { public: CString GetKey() const { return GetParam(1); } void SetKey(const CString& sKey) { SetParam(1, sKey); } }; +REGISTER_ZNC_MESSAGE(CJoinMessage); class CModeMessage : public CTargetMessage { public: CString GetModes() const { return GetParams(1).TrimPrefix_n(":"); } }; +REGISTER_ZNC_MESSAGE(CModeMessage); class CNickMessage : public CMessage { public: @@ -179,17 +191,20 @@ public: CString GetNewNick() const { return GetParam(0); } void SetNewNick(const CString& sNick) { SetParam(0, sNick); } }; +REGISTER_ZNC_MESSAGE(CNickMessage); class CNoticeMessage : public CTargetMessage { public: CString GetText() const { return GetParam(1); } void SetText(const CString& sText) { SetParam(1, sText); } }; +REGISTER_ZNC_MESSAGE(CNoticeMessage); class CNumericMessage : public CMessage { public: unsigned int GetCode() const { return GetCommand().ToUInt(); } }; +REGISTER_ZNC_MESSAGE(CNumericMessage); class CKickMessage : public CTargetMessage { public: @@ -198,29 +213,34 @@ public: CString GetReason() const { return GetParam(2); } void SetReason(const CString& sReason) { SetParam(2, sReason); } }; +REGISTER_ZNC_MESSAGE(CKickMessage); class CPartMessage : public CTargetMessage { public: CString GetReason() const { return GetParam(1); } void SetReason(const CString& sReason) { SetParam(1, sReason); } }; +REGISTER_ZNC_MESSAGE(CPartMessage); class CQuitMessage : public CMessage { public: CString GetReason() const { return GetParam(0); } void SetReason(const CString& sReason) { SetParam(0, sReason); } }; +REGISTER_ZNC_MESSAGE(CQuitMessage); class CTextMessage : public CTargetMessage { public: CString GetText() const { return GetParam(1); } void SetText(const CString& sText) { SetParam(1, sText); } }; +REGISTER_ZNC_MESSAGE(CTextMessage); class CTopicMessage : public CTargetMessage { public: CString GetTopic() const { return GetParam(1); } void SetTopic(const CString& sTopic) { SetParam(1, sTopic); } }; +REGISTER_ZNC_MESSAGE(CTopicMessage); #endif // !ZNC_MESSAGE_H diff --git a/modules/modperl/functions.in b/modules/modperl/functions.in index e3f58298..4fceb1cc 100644 --- a/modules/modperl/functions.in +++ b/modules/modperl/functions.in @@ -67,3 +67,32 @@ EModRet OnDeleteNetwork(CIRCNetwork& Network) EModRet OnSendToClient(CString& sLine, CClient& Client) EModRet OnSendToIRC(CString& sLine) +EModRet OnRawMessage(CMessage& Message) +EModRet OnNumericMessage(CNumericMessage& Message) +void OnQuitMessage(CQuitMessage& Message, const std::vector& vChans) +void OnNickMessage(CNickMessage& Message, const std::vector& vChans) +void OnKickMessage(CKickMessage& Message) +void OnJoinMessage(CJoinMessage& Message) +void OnPartMessage(CPartMessage& Message) +EModRet OnChanBufferPlayMessage(CMessage& Message) +EModRet OnPrivBufferPlayMessage(CMessage& Message) +EModRet OnUserRawMessage(CMessage& Message) +EModRet OnUserCTCPReplyMessage(CCTCPMessage& Message) +EModRet OnUserCTCPMessage(CCTCPMessage& Message) +EModRet OnUserActionMessage(CActionMessage& Message) +EModRet OnUserTextMessage(CTextMessage& Message) +EModRet OnUserNoticeMessage(CNoticeMessage& Message) +EModRet OnUserJoinMessage(CJoinMessage& Message) +EModRet OnUserPartMessage(CPartMessage& Message) +EModRet OnUserTopicMessage(CTopicMessage& Message) +EModRet OnUserQuitMessage(CQuitMessage& Message) +EModRet OnCTCPReplyMessage(CCTCPMessage& Message) +EModRet OnPrivCTCPMessage(CCTCPMessage& Message) +EModRet OnChanCTCPMessage(CCTCPMessage& Message) +EModRet OnPrivActionMessage(CActionMessage& Message) +EModRet OnChanActionMessage(CActionMessage& Message) +EModRet OnPrivMessage(CTextMessage& Message) +EModRet OnChanMessage(CTextMessage& Message) +EModRet OnPrivNoticeMessage(CNoticeMessage& Message) +EModRet OnChanNoticeMessage(CNoticeMessage& Message) +EModRet OnTopicMessage(CTopicMessage& Message) diff --git a/modules/modperl/modperl.i b/modules/modperl/modperl.i index a8837e51..ac0ad367 100644 --- a/modules/modperl/modperl.i +++ b/modules/modperl/modperl.i @@ -105,6 +105,9 @@ class MCString : public std::map {}; %template(BufLines) std::deque; %template(VVString) std::vector; +#define REGISTER_ZNC_MESSAGE(M) \ + %template(As_ ## M) CMessage::As; + %typemap(out) std::map { HV* myhv = newHV(); for (std::map::const_iterator i = $1.begin(); i != $1.end(); ++i) { @@ -129,6 +132,7 @@ class MCString : public std::map {}; %template(ZNCSocketManager) TSocketManager; %include "../include/znc/Socket.h" %include "../include/znc/FileUtils.h" +%include "../include/znc/Message.h" %include "../include/znc/Modules.h" %include "../include/znc/Nick.h" %include "../include/znc/Chan.h" diff --git a/modules/modperl/module.h b/modules/modperl/module.h index fc797c1c..5206465d 100644 --- a/modules/modperl/module.h +++ b/modules/modperl/module.h @@ -106,6 +106,36 @@ public: EModRet OnDeleteNetwork(CIRCNetwork& Network) override; EModRet OnSendToClient(CString& sLine, CClient& Client) override; EModRet OnSendToIRC(CString& sLine) override; + + EModRet OnRawMessage(CMessage& Message) override; + EModRet OnNumericMessage(CNumericMessage& Message) override; + void OnQuitMessage(CQuitMessage& Message, const std::vector& vChans) override; + void OnNickMessage(CNickMessage& Message, const std::vector& vChans) override; + void OnKickMessage(CKickMessage& Message) override; + void OnJoinMessage(CJoinMessage& Message) override; + void OnPartMessage(CPartMessage& Message) override; + EModRet OnChanBufferPlayMessage(CMessage& Message) override; + EModRet OnPrivBufferPlayMessage(CMessage& Message) override; + EModRet OnUserRawMessage(CMessage& Message) override; + EModRet OnUserCTCPReplyMessage(CCTCPMessage& Message) override; + EModRet OnUserCTCPMessage(CCTCPMessage& Message) override; + EModRet OnUserActionMessage(CActionMessage& Message) override; + EModRet OnUserTextMessage(CTextMessage& Message) override; + EModRet OnUserNoticeMessage(CNoticeMessage& Message) override; + EModRet OnUserJoinMessage(CJoinMessage& Message) override; + EModRet OnUserPartMessage(CPartMessage& Message) override; + EModRet OnUserTopicMessage(CTopicMessage& Message) override; + EModRet OnUserQuitMessage(CQuitMessage& Message) override; + EModRet OnCTCPReplyMessage(CCTCPMessage& Message) override; + EModRet OnPrivCTCPMessage(CCTCPMessage& Message) override; + EModRet OnChanCTCPMessage(CCTCPMessage& Message) override; + EModRet OnPrivActionMessage(CActionMessage& Message) override; + EModRet OnChanActionMessage(CActionMessage& Message) override; + EModRet OnPrivMessage(CTextMessage& Message) override; + EModRet OnChanMessage(CTextMessage& Message) override; + EModRet OnPrivNoticeMessage(CNoticeMessage& Message) override; + EModRet OnChanNoticeMessage(CNoticeMessage& Message) override; + EModRet OnTopicMessage(CTopicMessage& Message) override; }; static inline CPerlModule* AsPerlModule(CModule* p) { diff --git a/modules/modperl/startup.pl b/modules/modperl/startup.pl index 0a5e0f45..8e921838 100644 --- a/modules/modperl/startup.pl +++ b/modules/modperl/startup.pl @@ -21,6 +21,14 @@ use ZNC; use IO::File; use feature 'switch', 'say'; +package ZNC::CMessage; +sub As { + # e.g. $msg->As('CNumericMessage') + my ($self, $name) = @_; + my $method = "As_$name"; + $self->$method; +} + package ZNC::Core; my %modrefcount; @@ -375,6 +383,181 @@ sub OnDeleteNetwork {} sub OnSendToClient {} sub OnSendToIRC {} +# Deprecated non-Message functions should still work, for now. +sub OnRawMessage {} +sub OnNumericMessage {} +sub OnQuitMessage { my ($self, $msg, @chans) = @_; $self->OnQuit($msg->GetNick, $msg->GetReason, @chans) } +sub OnNickMessage { my ($self, $msg, @chans) = @_; $self->OnNick($msg->GetNick, $msg->GetNewNick, @chans) } +sub OnKickMessage { my ($self, $msg) = @_; $self->OnKick($msg->GetNick, $msg->GetKickedNick, $msg->GetChan, $msg->GetReason) } +sub OnJoinMessage { my ($self, $msg) = @_; $self->OnJoin($msg->GetNick, $msg->GetChan) } +sub OnPartMessage { my ($self, $msg) = @_; $self->OnPart($msg->GetNick, $msg->GetChan, $msg->GetReason) } +sub OnChanBufferPlayMessage { + my ($self, $msg) = @_; + my $old = $msg->ToString($ZNC::CMessage::ExcludeTags); + my $modified = $old; + my ($ret) = $self->OnChanBufferPlayLine($msg->GetChan, $msg->GetClient, $modified); + $msg->Parse($modified) if $old ne $modified; + return $ret; +} +sub OnPrivBufferPlayMessage { + my ($self, $msg) = @_; + my $old = $msg->ToString($ZNC::CMessage::ExcludeTags); + my $modified = $old; + my ($ret) = $self->OnPrivBufferPlayLine($msg->GetClient, $modified); + $msg->Parse($modified) if $old ne $modified; + return $ret; +} +sub OnUserRawMessage {} +sub OnUserCTCPReplyMessage { + my ($self, $msg) = @_; + my $target = $msg->GetTarget; + my $text = $msg->GetText; + my ($ret) = $self->OnUserCTCPReply($target, $text); + $msg->SetTarget($target); + $msg->SetText($text); + return $ret; +} +sub OnUserCTCPMessage { + my ($self, $msg) = @_; + my $target = $msg->GetTarget; + my $text = $msg->GetText; + my ($ret) = $self->OnUserCTCP($target, $text); + $msg->SetTarget($target); + $msg->SetText($text); + return $ret; +} +sub OnUserActionMessage { + my ($self, $msg) = @_; + my $target = $msg->GetTarget; + my $text = $msg->GetText; + my ($ret) = $self->OnUserAction($target, $text); + $msg->SetTarget($target); + $msg->SetText($text); + return $ret; +} +sub OnUserTextMessage { + my ($self, $msg) = @_; + my $target = $msg->GetTarget; + my $text = $msg->GetText; + my ($ret) = $self->OnUserMsg($target, $text); + $msg->SetTarget($target); + $msg->SetText($text); + return $ret; +} +sub OnUserNoticeMessage { + my ($self, $msg) = @_; + my $target = $msg->GetTarget; + my $text = $msg->GetText; + my ($ret) = $self->OnUserNotice($target, $text); + $msg->SetTarget($target); + $msg->SetText($text); + return $ret; +} +sub OnUserJoinMessage { + my ($self, $msg) = @_; + my $chan = $msg->GetTarget; + my $key = $msg->GetKey; + my ($ret) = $self->OnUserJoin($chan, $key); + $msg->SetTarget($chan); + $msg->SetKey($key); + return $ret; +} +sub OnUserPartMessage { + my ($self, $msg) = @_; + my $chan = $msg->GetTarget; + my $reason = $msg->GetReason; + my ($ret) = $self->OnUserPart($chan, $reason); + $msg->SetTarget($chan); + $msg->SetReason($reason); + return $ret; +} +sub OnUserTopicMessage { + my ($self, $msg) = @_; + my $chan = $msg->GetTarget; + my $topic = $msg->GetTopic; + my ($ret) = $self->OnUserTopic($chan, $topic); + $msg->SetTarget($chan); + $msg->SetTopic($topic); + return $ret; +} +sub OnUserQuitMessage { + my ($self, $msg) = @_; + my $reason = $msg->GetReason; + my ($ret) = $self->OnUserQuit($reason); + $msg->SetReason($reason); + return $ret; +} +sub OnCTCPReplyMessage { + my ($self, $msg) = @_; + my $text = $msg->GetText; + my ($ret) = $self->OnCTCPReply($msg->GetNick, $text); + $msg->SetText($text); + return $ret; +} +sub OnPrivCTCPMessage { + my ($self, $msg) = @_; + my $text = $msg->GetText; + my ($ret) = $self->OnPrivCTCP($msg->GetNick, $text); + $msg->SetText($text); + return $ret; +} +sub OnChanCTCPMessage { + my ($self, $msg) = @_; + my $text = $msg->GetText; + my ($ret) = $self->OnChanCTCP($msg->GetNick, $msg->GetChan, $text); + $msg->SetText($text); + return $ret; +} +sub OnPrivActionMessage { + my ($self, $msg) = @_; + my $text = $msg->GetText; + my ($ret) = $self->OnPrivAction($msg->GetNick, $text); + $msg->SetText($text); + return $ret; +} +sub OnChanActionMessage { + my ($self, $msg) = @_; + my $text = $msg->GetText; + my ($ret) = $self->OnChanAction($msg->GetNick, $msg->GetChan, $text); + $msg->SetText($text); + return $ret; +} +sub OnPrivMessage { + my ($self, $msg) = @_; + my $text = $msg->GetText; + my ($ret) = $self->OnPrivMsg($msg->GetNick, $text); + $msg->SetText($text); + return $ret; +} +sub OnChanMessage { + my ($self, $msg) = @_; + my $text = $msg->GetText; + my ($ret) = $self->OnChanMsg($msg->GetNick, $msg->GetChan, $text); + $msg->SetText($text); + return $ret; +} +sub OnPrivNoticeMessage { + my ($self, $msg) = @_; + my $text = $msg->GetText; + my ($ret) = $self->OnPrivNotice($msg->GetNick, $text); + $msg->SetText($text); + return $ret; +} +sub OnChanNoticeMessage { + my ($self, $msg) = @_; + my $text = $msg->GetText; + my ($ret) = $self->OnChanNotice($msg->GetNick, $msg->GetChan, $text); + $msg->SetText($text); + return $ret; +} +sub OnTopicMessage { + my ($self, $msg) = @_; + my $topic = $msg->GetTopic; + my ($ret) = $self->OnTopic($msg->GetNick, $msg->GetChan, $topic); + $msg->SetTopic($topic); + return $ret; +} + # In Perl "undefined" is allowed value, so perl modules may continue using OnMode and not OnMode2 sub OnChanPermission2 { my $self = shift; $self->OnChanPermission(@_) } sub OnOp2 { my $self = shift; $self->OnOp(@_) } diff --git a/modules/modpython/functions.in b/modules/modpython/functions.in index 5e324687..d88eb5b1 100644 --- a/modules/modpython/functions.in +++ b/modules/modpython/functions.in @@ -67,11 +67,42 @@ EModRet OnDeleteNetwork(CIRCNetwork& Network) EModRet OnSendToClient(CString& sLine, CClient& Client) EModRet OnSendToIRC(CString& sLine) +EModRet OnRawMessage(CMessage& Message) +EModRet OnNumericMessage(CNumericMessage& Message) +void OnQuitMessage(CQuitMessage& Message, const std::vector& vChans) +void OnNickMessage(CNickMessage& Message, const std::vector& vChans) +void OnKickMessage(CKickMessage& Message) +void OnJoinMessage(CJoinMessage& Message) +void OnPartMessage(CPartMessage& Message) +EModRet OnChanBufferPlayMessage(CMessage& Message) +EModRet OnPrivBufferPlayMessage(CMessage& Message) +EModRet OnUserRawMessage(CMessage& Message) +EModRet OnUserCTCPReplyMessage(CCTCPMessage& Message) +EModRet OnUserCTCPMessage(CCTCPMessage& Message) +EModRet OnUserActionMessage(CActionMessage& Message) +EModRet OnUserTextMessage(CTextMessage& Message) +EModRet OnUserNoticeMessage(CNoticeMessage& Message) +EModRet OnUserJoinMessage(CJoinMessage& Message) +EModRet OnUserPartMessage(CPartMessage& Message) +EModRet OnUserTopicMessage(CTopicMessage& Message) +EModRet OnUserQuitMessage(CQuitMessage& Message) +EModRet OnCTCPReplyMessage(CCTCPMessage& Message) +EModRet OnPrivCTCPMessage(CCTCPMessage& Message) +EModRet OnChanCTCPMessage(CCTCPMessage& Message) +EModRet OnPrivActionMessage(CActionMessage& Message) +EModRet OnChanActionMessage(CActionMessage& Message) +EModRet OnPrivMessage(CTextMessage& Message) +EModRet OnChanMessage(CTextMessage& Message) +EModRet OnPrivNoticeMessage(CNoticeMessage& Message) +EModRet OnChanNoticeMessage(CNoticeMessage& Message) +EModRet OnTopicMessage(CTopicMessage& Message) + EModRet OnAddUser(CUser& User, CString& sErrorRet) EModRet OnDeleteUser(CUser& User) void OnClientConnect(CZNCSock* pSock, const CString& sHost, unsigned short uPort) void OnFailedLogin(const CString& sUsername, const CString& sRemoteIP) EModRet OnUnknownUserRaw(CClient* pClient, CString& sLine) +EModRet OnUnknownUserRawMessage(CMessage& Message) bool IsClientCapSupported(CClient* pClient, const CString& sCap, bool bState)=false void OnClientCapRequest(CClient* pClient, const CString& sCap, bool bState) EModRet OnModuleLoading(const CString& sModName, const CString& sArgs, CModInfo::EModuleType eType, bool& bSuccess, CString& sRetMsg) diff --git a/modules/modpython/modpython.i b/modules/modpython/modpython.i index bfe00ced..0e1e9bd2 100644 --- a/modules/modpython/modpython.i +++ b/modules/modpython/modpython.i @@ -106,6 +106,9 @@ class MCString : public std::map {}; %template(VVString) std::vector; %template(VClients) std::vector; +#define REGISTER_ZNC_MESSAGE(M) \ + %template(As_ ## M) CMessage::As; + %typemap(in) CString& { String* p; int res = SWIG_IsOK(SWIG_ConvertPtr($input, (void**)&p, SWIG_TypeQuery("String*"), 0)); @@ -153,6 +156,7 @@ class MCString : public std::map {}; %template(ZNCSocketManager) TSocketManager; %include "../include/znc/Socket.h" %include "../include/znc/FileUtils.h" +%include "../include/znc/Message.h" %include "../include/znc/Modules.h" %include "../include/znc/Nick.h" %include "../include/znc/Chan.h" @@ -291,6 +295,15 @@ class CPyRetBool { } }; +%extend CMessage { + CString __str__() { + return $self->ToString(); + } + CString __repr__() { + return $self->ToString(); + } +}; + %extend CZNC { PyObject* GetUserMap_() { PyObject* result = PyDict_New(); diff --git a/modules/modpython/module.h b/modules/modpython/module.h index caa40f4f..34a3acfb 100644 --- a/modules/modpython/module.h +++ b/modules/modpython/module.h @@ -16,9 +16,13 @@ #pragma once +// This class is used from python to call functions which accept CString& +// __str__ is added to it in modpython.i class String { public: CString s; + + String(const CString& s = "") : s(s) {} }; class CModPython; @@ -123,12 +127,43 @@ public: EModRet OnSendToClient(CString& sLine, CClient& Client) override; EModRet OnSendToIRC(CString& sLine) override; + EModRet OnRawMessage(CMessage& Message) override; + EModRet OnNumericMessage(CNumericMessage& Message) override; + void OnQuitMessage(CQuitMessage& Message, const std::vector& vChans) override; + void OnNickMessage(CNickMessage& Message, const std::vector& vChans) override; + void OnKickMessage(CKickMessage& Message) override; + void OnJoinMessage(CJoinMessage& Message) override; + void OnPartMessage(CPartMessage& Message) override; + EModRet OnChanBufferPlayMessage(CMessage& Message) override; + EModRet OnPrivBufferPlayMessage(CMessage& Message) override; + EModRet OnUserRawMessage(CMessage& Message) override; + EModRet OnUserCTCPReplyMessage(CCTCPMessage& Message) override; + EModRet OnUserCTCPMessage(CCTCPMessage& Message) override; + EModRet OnUserActionMessage(CActionMessage& Message) override; + EModRet OnUserTextMessage(CTextMessage& Message) override; + EModRet OnUserNoticeMessage(CNoticeMessage& Message) override; + EModRet OnUserJoinMessage(CJoinMessage& Message) override; + EModRet OnUserPartMessage(CPartMessage& Message) override; + EModRet OnUserTopicMessage(CTopicMessage& Message) override; + EModRet OnUserQuitMessage(CQuitMessage& Message) override; + EModRet OnCTCPReplyMessage(CCTCPMessage& Message) override; + EModRet OnPrivCTCPMessage(CCTCPMessage& Message) override; + EModRet OnChanCTCPMessage(CCTCPMessage& Message) override; + EModRet OnPrivActionMessage(CActionMessage& Message) override; + EModRet OnChanActionMessage(CActionMessage& Message) override; + EModRet OnPrivMessage(CTextMessage& Message) override; + EModRet OnChanMessage(CTextMessage& Message) override; + EModRet OnPrivNoticeMessage(CNoticeMessage& Message) override; + EModRet OnChanNoticeMessage(CNoticeMessage& Message) override; + EModRet OnTopicMessage(CTopicMessage& Message) override; + // Global Modules EModRet OnAddUser(CUser& User, CString& sErrorRet) override; EModRet OnDeleteUser(CUser& User) override; void OnClientConnect(CZNCSock* pSock, const CString& sHost, unsigned short uPort) override; void OnFailedLogin(const CString& sUsername, const CString& sRemoteIP) override; EModRet OnUnknownUserRaw(CClient* pClient, CString& sLine) override; + EModRet OnUnknownUserRawMessage(CMessage& Message) override; bool IsClientCapSupported(CClient* pClient, const CString& sCap, bool bState) override; void OnClientCapRequest(CClient* pClient, const CString& sCap, bool bState) override; virtual EModRet OnModuleLoading(const CString& sModName, const CString& sArgs, diff --git a/modules/modpython/znc.py b/modules/modpython/znc.py index 0b6a1217..9dcda782 100644 --- a/modules/modpython/znc.py +++ b/modules/modpython/znc.py @@ -458,6 +458,180 @@ class Module: def OnRawMode2(self, OpNick, Channel, sModes, sArgs): return self.OnRawMode(OpNick, Channel, sModes, sArgs) + def OnRawMessage(self, msg): + pass + + def OnNumericMessage(self, msg): + pass + + # Deprecated non-Message functions should still work, for now. + def OnQuitMessage(self, msg, vChans): + return self.OnQuit(msg.GetNick(), msg.GetReason(), vChans) + + def OnNickMessage(self, msg, vChans): + return self.OnNick(msg.GetNick(), msg.GetNewNick(), vChans) + + def OnKickMessage(self, msg): + return self.OnKick(msg.GetNick(), msg.GetKickedNick(), msg.GetChan(), msg.GetReason()) + + def OnJoinMessage(self, msg): + return self.OnJoin(msg.GetNick(), msg.GetChan()) + + def OnPartMessage(self, msg): + return self.OnPart(msg.GetNick(), msg.GetChan(), msg.GetReason()) + + def OnChanBufferPlayMessage(self, msg): + modified = String() + old = modified.s = msg.ToString(CMessage.ExcludeTags) + ret = self.OnChanBufferPlayLine(msg.GetChan(), msg.GetClient(), modified) + if old != modified.s: + msg.Parse(modified.s) + return ret + + def OnPrivBufferPlayMessage(self, msg): + modified = String() + old = modified.s = msg.ToString(CMessage.ExcludeTags) + ret = self.OnPrivBufferPlayLine(msg.GetClient(), modified) + if old != modified.s: + msg.Parse(modified.s) + return ret + + def OnUserRawMessage(self, msg): + pass + + def OnUserCTCPReplyMessage(self, msg): + target = String(msg.GetTarget()) + text = String(msg.GetText()) + ret = self.OnUserCTCPReply(target, text) + msg.SetTarget(target.s) + msg.SetText(text.s) + return ret + + def OnUserCTCPMessage(self, msg): + target = String(msg.GetTarget()) + text = String(msg.GetText()) + ret = self.OnUserCTCP(target, text) + msg.SetTarget(target.s) + msg.SetText(text.s) + return ret + + def OnUserActionMessage(self, msg): + target = String(msg.GetTarget()) + text = String(msg.GetText()) + ret = self.OnUserAction(target, text) + msg.SetTarget(target.s) + msg.SetText(text.s) + return ret + + def OnUserTextMessage(self, msg): + target = String(msg.GetTarget()) + text = String(msg.GetText()) + ret = self.OnUserMsg(target, text) + msg.SetTarget(target.s) + msg.SetText(text.s) + return ret + + def OnUserNoticeMessage(self, msg): + target = String(msg.GetTarget()) + text = String(msg.GetText()) + ret = self.OnUserNotice(target, text) + msg.SetTarget(target.s) + msg.SetText(text.s) + return ret + + def OnUserJoinMessage(self, msg): + chan = String(msg.GetTarget()) + key = String(msg.GetKey()) + ret = self.OnUserJoin(chan, key) + msg.SetTarget(chan.s) + msg.SetKey(key.s) + return ret + + def OnUserPartMessage(self, msg): + chan = String(msg.GetTarget()) + reason = String(msg.GetReason()) + ret = self.OnUserPart(chan, reason) + msg.SetTarget(chan.s) + msg.SetReason(reason.s) + return ret + + def OnUserTopicMessage(self, msg): + chan = String(msg.GetTarget()) + topic = String(msg.GetTopic()) + ret = self.OnUserTopic(chan, topic) + msg.SetTarget(chan.s) + msg.SetTopic(topic.s) + return ret + + def OnUserQuitMessage(self, msg): + reason = String(msg.GetReason()) + ret = self.OnUserQuit(reason) + msg.SetReason(reason.s) + return ret + + def OnCTCPReplyMessage(self, msg): + text = String(msg.GetText()) + ret = self.OnCTCPReply(msg.GetNick(), text) + msg.SetText(text.s) + return ret + + def OnPrivCTCPMessage(self, msg): + text = String(msg.GetText()) + ret = self.OnPrivCTCP(msg.GetNick(), text) + msg.SetText(text.s) + return ret + + def OnChanCTCPMessage(self, msg): + text = String(msg.GetText()) + ret = self.OnChanCTCP(msg.GetNick(), msg.GetChan(), text) + msg.SetText(text.s) + return ret + + def OnPrivActionMessage(self, msg): + text = String(msg.GetText()) + ret = self.OnPrivAction(msg.GetNick(), text) + msg.SetText(text.s) + return ret + + def OnChanActionMessage(self, msg): + text = String(msg.GetText()) + ret = self.OnChanAction(msg.GetNick(), msg.GetChan(), text) + msg.SetText(text.s) + return ret + + def OnPrivMessage(self, msg): + text = String(msg.GetText()) + ret = self.OnPrivMsg(msg.GetNick(), text) + msg.SetText(text.s) + return ret + + def OnChanMessage(self, msg): + text = String(msg.GetText()) + ret = self.OnChanMsg(msg.GetNick(), msg.GetChan(), text) + msg.SetText(text.s) + return ret + + def OnPrivNoticeMessage(self, msg): + text = String(msg.GetText()) + ret = self.OnPrivNotice(msg.GetNick(), text) + msg.SetText(text.s) + return ret + + def OnChanNoticeMessage(self, msg): + text = String(msg.GetText()) + ret = self.OnChanNotice(msg.GetNick(), msg.GetChan(), text) + msg.SetText(text.s) + return ret + + def OnTopicMessage(self, msg): + topic = String(msg.GetTopic()) + ret = self.OnTopic(msg.GetNick(), msg.GetChan(), topic) + msg.SetTopic(topic.s) + return ret + + def OnUnknownUserRawMessage(self, msg): + pass + def make_inherit(cl, parent, attr): def make_caller(parent, name, attr): @@ -755,6 +929,12 @@ class ModulesIter(collections.Iterator): CModules.__iter__ = lambda cmod: ModulesIter(CModulesIter(cmod)) +# e.g. msg.As(znc.CNumericMessage) +def _CMessage_As(self, cl): + return getattr(self, 'As_' + cl.__name__, lambda: self)() +CMessage.As = _CMessage_As + + def str_eq(self, other): if str(other) == str(self): return True