Teach modperl and modpython about CMessage and new hooks which accept it.

Fix #1084
Fix #1085
This commit is contained in:
Alexey Sokolov
2015-11-22 23:38:04 +00:00
parent 11b19a63f1
commit cbf5c38d0a
9 changed files with 525 additions and 0 deletions

View File

@@ -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<CChan*>& vChans)
void OnNickMessage(CNickMessage& Message, const std::vector<CChan*>& 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)

View File

@@ -106,6 +106,9 @@ class MCString : public std::map<CString, CString> {};
%template(VVString) std::vector<VCString>;
%template(VClients) std::vector<CClient*>;
#define REGISTER_ZNC_MESSAGE(M) \
%template(As_ ## M) CMessage::As<M>;
%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<CString, CString> {};
%template(ZNCSocketManager) TSocketManager<CZNCSock>;
%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();

View File

@@ -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<CChan*>& vChans) override;
void OnNickMessage(CNickMessage& Message, const std::vector<CChan*>& 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,

View File

@@ -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