20 #include "C4Version.h"
29 if (!ppPar || !*ppPar || !**ppPar)
36 Result.
Ref(*ppPar + 1);
65 : Name(szName), pUsers(nullptr), fReceivingUsers(false)
78 if (
SEqual(pUser->getName(), szName))
83 void C4Network2IRCChannel::OnUsers(
const char *szUsers,
const char *szPrefixes)
86 szPrefixes =
SSearch(szPrefixes,
")");
90 while (szUsers && *szUsers)
95 const char *szName = PrefixedName.
getData();
97 while (strchr(szPrefixes, *szName))
103 AddUser(szName)->SetPrefix(Prefix.
getData());
106 fReceivingUsers =
true;
109 void C4Network2IRCChannel::OnUsersEnd()
112 fReceivingUsers =
false;
115 void C4Network2IRCChannel::OnTopic(
const char *szTopic)
120 void C4Network2IRCChannel::OnKick(
const char *szUser,
const char *szComment)
124 if (pUser) DeleteUser(pUser);
127 void C4Network2IRCChannel::OnPart(
const char *szUser,
const char *szComment)
131 if (pUser) DeleteUser(pUser);
134 void C4Network2IRCChannel::OnJoin(
const char *szUser)
145 if (pUser)
return pUser;
148 pUser->Next = pUsers;
157 pUsers = pUser->Next;
161 while (pPrev && pPrev->Next != pUser)
164 pPrev->Next = pUser->Next;
170 void C4Network2IRCChannel::ClearUsers()
194 rOutBuf.
Write(rPacket, iPos);
196 uint8_t *pPos = getMBufPtr<uint8_t>(rOutBuf, iPos +
iSize);
197 *pPos =
'\r'; *(pPos + 1) =
'\n';
203 const char *pSep =
reinterpret_cast<const char *
>(memchr(rInBuf.
getData(),
'\n', rInBuf.
getSize()));
207 int iSize = pSep - getBufPtr<char>(rInBuf) + 1,
209 if (iLength && *(pSep - 1) ==
'\r')
214 const char *pMsg = Buf.
getData();
230 const char *szParameters =
SSearch(pMsg,
" ");
231 OnCommand(Prefix.
getData(), Cmd.
getData(), szParameters ? szParameters :
"");
239 if (!fConnecting || fConnected || AddrConnect != ServerAddr)
return false;
244 C4Network2IRCClient::PeerAddr = AddrPeer;
254 void C4Network2IRCClient::OnDisconn(
const C4NetIO::addr_t &AddrPeer,
C4NetIO *pNetIO,
const char *szReason)
273 return pPrevChan ? pPrevChan->Next : pChannels;
294 pLogLastRead = pLogEnd;
295 iUnreadLogLength = 0;
304 if (fConnecting || fConnected)
313 {
SetError(
"Could no resolve server address!");
return false; }
316 Nick = szNick; RealName = szRealName;
317 Password = szPassword; AutoJoin = szAutoJoin;
344 while (pChan != pChannels)
347 while(pChanPrev->Next != pChan)
348 pChanPrev = pChanPrev->Next;
356 DeleteChannel(pChannels);
360 fConnected = fConnecting =
false;
367 {
SetError(
"not connected");
return false; }
371 Msg.
Format(
"%s %s", szCommand, szParameters);
392 const char* message =
LoadResStr(
"IDS_ERR_CHANNELNOTALLOWED");
394 SetError(
"Joining this channel not allowed");
398 return Send(
"JOIN", szChannel);
403 return Send(
"PART", szChannel);
424 if (!
Send(
"PRIVMSG",
FormatString(
"%s :\1ACTION %s\1", szTarget, szText).getData()))
432 return Send(
"NICK", szNewNick);
437 return Send(
"PRIVMSG",
FormatString(
"NickServ :REGISTER %s %s", szPassword, szMail).getData());
440 void C4Network2IRCClient::OnCommand(
const char *szSender,
const char *szCommand,
const char *szParameters)
444 if (isdigit((
unsigned char)*szCommand) &&
SLen(szCommand) == 3)
446 OnNumericCommand(szSender, atoi(szCommand), szParameters);
451 if (szSender) SenderNick.
CopyUntil(szSender,
'!');
454 Send(
"PONG", szParameters);
472 pChan->OnJoin(SenderNick.
getData());
474 if (SenderNick == Nick)
490 if (SenderNick == Nick)
492 DeleteChannel(pChan);
513 DeleteChannel(pChan);
530 pChan->OnPart(SenderNick.
getData(),
"Quit");
579 pChan->OnPart(SenderNick.
getData(),
"Nickchange");
580 pChan->OnJoin(NewNick.
getData());
584 if (SenderNick == Nick)
589 void C4Network2IRCClient::OnNumericCommand(
const char *szSender,
int iCommand,
const char *szParameters)
591 bool fShowMessage =
true;
628 fShowMessage =
false;
639 fShowMessage =
false;
648 AddChannel(Channel.
getData())->OnUsersEnd();
649 fShowMessage =
false;
656 fShowMessage =
false;
661 while (szParameters && *szParameters)
670 fShowMessage =
false;
680 if (szParameters && *szParameters && *szParameters !=
':')
683 const char *pMsg = szParameters;
684 while (pMsg && *pMsg && *pMsg !=
':')
697 void C4Network2IRCClient::OnConnected()
709 void C4Network2IRCClient::OnMessage(
bool fNotice,
const char *szSender,
const char *szTarget,
const char *szText)
712 const char X_DELIM =
'\001';
713 if (szText[0] == X_DELIM)
716 const char *pMsg = szText + 1;
720 const char *pEnd = strchr(pMsg, X_DELIM);
721 if (!pEnd) pEnd = pMsg +
SLen(pMsg);
729 PushMessage(
MSG_Action, szSender, szTarget, szData ? szData :
"");
748 if (*pMsg == X_DELIM) pMsg++;
758 void C4Network2IRCClient::PopMessage()
760 if (!iLogLength)
return;
764 if (!pLog) pLogEnd =
nullptr;
765 if (pLogLastRead == pMsg) pLogLastRead =
nullptr;
769 if (iUnreadLogLength > iLogLength) iUnreadLogLength = iLogLength;
772 void C4Network2IRCClient::PushMessage(
C4Network2IRCMessageType eType,
const char *szSource,
const char *szTarget,
const char *szText)
779 pLogEnd->Next = pMsg;
800 if (pChan)
return pChan;
803 pChan->Next = pChannels;
811 if (pChannel == pChannels)
812 pChannels = pChannel->Next;
816 while (pPrev && pPrev->Next != pChannel)
819 pPrev->Next = pChannel->Next;
C4Application Application
const char * LoadResStr(const char *id)
StdStrBuf ircExtractPar(const char **ppPar)
const int C4NetIRCMaxReadLogLength
const int C4NetIRCMaxLogLength
bool SWildcardMatchEx(const char *szString, const char *szWildcard)
const char * SSearch(const char *szString, const char *szIndex)
bool SEqualNoCase(const char *szStr1, const char *szStr2, int iLen)
bool SEqual(const char *szStr1, const char *szStr2)
size_t SLen(const char *sptr)
StdStrBuf FormatString(const char *szFmt,...)
C4InteractiveThread InteractiveThread
char Channel[CFG_MaxString+1]
bool ShowMessage(const char *szMessage, const char *szCaption, Icons icoIcon, int32_t *piConfigDontShowAgainSetting=nullptr)
bool PushEvent(C4InteractiveEventType eEventType, void *pData=nullptr)
bool ThreadPostAsync(Functor function)
void SetError(const char *strnError, bool fSockErr=false)
bool Send(const C4NetIOPacket &rPacket) override
bool Init(uint16_t iPort=addr_t::IPPORT_NONE) override
void SetCallback(CBClass *pnCallback) override
bool Connect(const addr_t &addr, std::unique_ptr< Socket > socket)
C4Network2IRCUser * getUser(const char *szName) const
C4Network2IRCChannel(const char *szName)
const char * getName() const
bool Send(const C4NetIOPacket &rPacket) override
bool Action(const char *szTarget, const char *szText)
bool ChangeNick(const char *szNewNick)
void MarkMessageLogRead()
bool RegisterNick(const char *szPassword, const char *szMail)
bool Notice(const char *szTarget, const char *szText)
bool Join(const char *szChannel)
C4Network2IRCChannel * getFirstChannel() const
~C4Network2IRCClient() override
C4Network2IRCChannel * getChannel(const char *szName) const
C4Network2IRCChannel * getNextChannel(C4Network2IRCChannel *pPrevChan) const
bool Message(const char *szTarget, const char *szText)
bool Quit(const char *szReason)
bool Part(const char *szChannel)
bool Connect(const addr_t &addr, std::unique_ptr< Socket > socket)
C4Network2IRCUser(const char *szName)
void Write(const void *pnData, size_t inSize, size_t iAt=0)
const void * getData() const
void SetLength(size_t iLength)
void CopyUntil(const char *szString, char cUntil)
void Ref(const char *pnData)
const char * getData() const
void AppendChar(char cChar)
void Append(const char *pnData, size_t iChars)
void Format(const char *szFmt,...) GNUC_FORMAT_ATTRIBUTE_O
void SetAddress(const sockaddr *addr)
void SetDefaultPort(uint16_t port)