Skip to content

Commit

Permalink
Add support for account-notify, extended-join
Browse files Browse the repository at this point in the history
Add support for account-notify to track account changes and
extended-join to get account information on join.  For now, this only
updates user/hostname information.  In the future it will track
logged in accounts in ircuser, pending a new feature flag and
inclusion of WHOX support.

See http://ircv3.net/specs/extensions/account-notify-3.1.html
And http://ircv3.net/specs/extensions/extended-join-3.1.html
  • Loading branch information
digitalcircuit committed Feb 17, 2016
1 parent 8408139 commit 9c59843
Show file tree
Hide file tree
Showing 4 changed files with 58 additions and 1 deletion.
1 change: 1 addition & 0 deletions src/common/eventmanager.h
Expand Up @@ -88,6 +88,7 @@ public :

IrcEvent = 0x00030000,
IrcEventAuthenticate,
IrcEventAccount,
IrcEventAway,
IrcEventCap,
IrcEventInvite,
Expand Down
18 changes: 18 additions & 0 deletions src/core/corenetwork.h
Expand Up @@ -150,6 +150,24 @@ class CoreNetwork : public Network
*/
inline bool useCapAwayNotify() const { return capEnabled("away-notify"); }

/**
* Gets the status of the account-notify capability.
*
* http://ircv3.net/specs/extensions/account-notify-3.1.html
*
* @returns True if account-notify is enabled, otherwise false
*/
inline bool useCapAccountNotify() const { return capEnabled("account-notify"); }

/**
* Gets the status of the extended-join capability.
*
* http://ircv3.net/specs/extensions/extended-join-3.1.html
*
* @returns True if extended-join is enabled, otherwise false
*/
inline bool useCapExtendedJoin() const { return capEnabled("extended-join"); }

public slots:
virtual void setMyNick(const QString &mynick);

Expand Down
39 changes: 38 additions & 1 deletion src/core/coresessioneventprocessor.cpp
Expand Up @@ -191,7 +191,9 @@ void CoreSessionEventProcessor::processIrcEventCap(IrcEvent *e)
// Only request SASL if it's enabled
if (coreNet->networkInfo().useSasl)
queueCurrentCap = true;
} else if (availableCapPair.at(0).startsWith("away-notify")) {
} else if (availableCapPair.at(0).startsWith("away-notify") ||
availableCapPair.at(0).startsWith("account-notify") ||
availableCapPair.at(0).startsWith("extended-join")) {
// Always request these capabilities if available
queueCurrentCap = true;
}
Expand Down Expand Up @@ -252,6 +254,30 @@ void CoreSessionEventProcessor::processIrcEventCap(IrcEvent *e)
}
}

/* IRCv3 account-notify
* Log in: ":nick!user@host ACCOUNT accountname"
* Log out: ":nick!user@host ACCOUNT *" */
void CoreSessionEventProcessor::processIrcEventAccount(IrcEvent *e)
{
if (!checkParamCount(e, 1))
return;

IrcUser *ircuser = e->network()->updateNickFromMask(e->prefix());
if (ircuser) {
// FIXME Keep track of authed user account, requires adding support to ircuser.h/cpp
/*
if (e->params().at(0) != "*") {
// Account logged in
qDebug() << "account-notify:" << ircuser->nick() << "logged in to" << e->params().at(0);
} else {
// Account logged out
qDebug() << "account-notify:" << ircuser->nick() << "logged out";
}
*/
} else {
qDebug() << "Received account-notify data for unknown user" << e->prefix();
}
}

/* IRCv3 away-notify - ":nick!user@host AWAY [:message]" */
void CoreSessionEventProcessor::processIrcEventAway(IrcEvent *e)
Expand Down Expand Up @@ -293,6 +319,17 @@ void CoreSessionEventProcessor::processIrcEventJoin(IrcEvent *e)
QString channel = e->params()[0];
IrcUser *ircuser = net->updateNickFromMask(e->prefix());

if (net->useCapExtendedJoin()) {
if (!checkParamCount(e, 3))
return;
// If logged in, :nick!user@host JOIN #channelname accountname :Real Name
// If logged out, :nick!user@host JOIN #channelname * :Real Name
// See: http://ircv3.net/specs/extensions/extended-join-3.1.html
// FIXME Keep track of authed user account, requires adding support to ircuser.h/cpp
ircuser->setRealName(e->params()[2]);
}
// Else :nick!user@host JOIN #channelname

bool handledByNetsplit = false;
foreach(Netsplit* n, _netsplits.value(e->network())) {
handledByNetsplit = n->userJoined(e->prefix(), channel);
Expand Down
1 change: 1 addition & 0 deletions src/core/coresessioneventprocessor.h
Expand Up @@ -48,6 +48,7 @@ class CoreSessionEventProcessor : public BasicHandler

Q_INVOKABLE void processIrcEventAuthenticate(IrcEvent *event); /// SASL authentication
Q_INVOKABLE void processIrcEventCap(IrcEvent *event); /// CAP framework negotiation
Q_INVOKABLE void processIrcEventAccount(IrcEvent *event); /// account-notify received
Q_INVOKABLE void processIrcEventAway(IrcEvent *event); /// away-notify received
Q_INVOKABLE void processIrcEventInvite(IrcEvent *event);
Q_INVOKABLE void processIrcEventJoin(IrcEvent *event);
Expand Down

0 comments on commit 9c59843

Please sign in to comment.