(irc) User-role support
This commit is contained in:
parent
8aa608e841
commit
7be306e20e
|
@ -1,5 +1,13 @@
|
|||
#ifndef _RESPONSE_NUMERICS_H
|
||||
#define _RESPONSE_NUMERICS_H
|
||||
#ifndef _IRC_CONSTANTS_H
|
||||
#define _IRC_CONSTANTS_H
|
||||
|
||||
enum UserRole {
|
||||
ROOM_MEMBER = 0,
|
||||
ROOM_HALFOP = 1,
|
||||
ROOM_OPERATOR = 2,
|
||||
IRC_OPERATOR = 3
|
||||
};
|
||||
|
||||
|
||||
#define RPL_WELCOME 1
|
||||
#define RPL_WHOISUSER 311
|
||||
|
@ -16,4 +24,4 @@
|
|||
#define ERR_ERRONEUSNICKNAME 432
|
||||
#define ERR_NICKNAMEINUSE 433
|
||||
|
||||
#endif // _RESPONSE_NUMERICS_H
|
||||
#endif // _IRC_CONSTANTS_H
|
|
@ -22,8 +22,6 @@
|
|||
#include <ChatProtocolMessages.h>
|
||||
#include <Flags.h>
|
||||
|
||||
#include "Numerics.h"
|
||||
|
||||
|
||||
#undef B_TRANSLATION_CONTEXT
|
||||
#define B_TRANSLATION_CONTEXT "IrcProtocol"
|
||||
|
@ -480,6 +478,7 @@ IrcProtocol::_ProcessNumeric(int32 numeric, BString sender, BStringList params,
|
|||
BString user = params.StringAt(2);
|
||||
BString host = params.StringAt(3);
|
||||
BString nick = params.StringAt(5);
|
||||
BString role = params.StringAt(6);
|
||||
BString ident = user;
|
||||
ident << "@" << host;
|
||||
|
||||
|
@ -488,12 +487,58 @@ IrcProtocol::_ProcessNumeric(int32 numeric, BString sender, BStringList params,
|
|||
|
||||
// Used to populate a room's userlist (one-by-one… :p)
|
||||
if (fWhoRequested == false && _IsChannelName(channel)) {
|
||||
// Send the participant themself
|
||||
BMessage user(IM_MESSAGE);
|
||||
user.AddInt32("im_what", IM_ROOM_PARTICIPANTS);
|
||||
user.AddString("chat_id", channel);
|
||||
user.AddString("user_id", ident);
|
||||
user.AddString("user_name", nick);
|
||||
_SendMsg(&user);
|
||||
|
||||
// Now let's crunch the appropriate role…
|
||||
bool away = false;
|
||||
UserRole priority = ROOM_MEMBER;
|
||||
for (int i=0; i < role.CountBytes(0, role.CountChars()); i++) {
|
||||
char c = role.ByteAt(i);
|
||||
switch (c) {
|
||||
case 'G':
|
||||
case 'H':
|
||||
away = false;
|
||||
break;
|
||||
case 'A':
|
||||
away = true;
|
||||
break;
|
||||
case '%':
|
||||
priority = ROOM_HALFOP;
|
||||
break;
|
||||
case '@':
|
||||
priority = ROOM_OPERATOR;
|
||||
break;
|
||||
case '*':
|
||||
priority = IRC_OPERATOR;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
// And send the user's role
|
||||
BMessage sensei(IM_MESSAGE);
|
||||
sensei.AddInt32("im_what", IM_ROOM_ROLECHANGED);
|
||||
sensei.AddString("chat_id", channel);
|
||||
sensei.AddString("user_id", ident);
|
||||
sensei.AddInt32("role_priority", priority);
|
||||
sensei.AddString("role_title", _RoleTitle(priority));
|
||||
sensei.AddInt32("role_perms", _RolePerms(priority));
|
||||
_SendMsg(&sensei);
|
||||
|
||||
// Also status! Can't forget that
|
||||
BMessage status(IM_MESSAGE);
|
||||
status.AddInt32("im_what", IM_USER_STATUS_SET);
|
||||
status.AddString("user_id", ident);
|
||||
if (away == true)
|
||||
status.AddInt32("status", STATUS_AWAY);
|
||||
else
|
||||
status.AddInt32("status", STATUS_ONLINE);
|
||||
_SendMsg(&status);
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
@ -660,6 +705,12 @@ IrcProtocol::_ProcessCommand(BString command, BString sender,
|
|||
fIdentNicks.AddItem(user_id, user_name);
|
||||
}
|
||||
_SendMsg(&joined);
|
||||
|
||||
BMessage status(IM_MESSAGE);
|
||||
status.AddInt32("im_what", IM_USER_STATUS_SET);
|
||||
status.AddString("user_id", user_id);
|
||||
status.AddInt32("status", STATUS_ONLINE);
|
||||
_SendMsg(&status);
|
||||
}
|
||||
else if (command == "PART")
|
||||
{
|
||||
|
@ -1033,6 +1084,37 @@ IrcProtocol::_SaveContacts()
|
|||
}
|
||||
|
||||
|
||||
int32
|
||||
IrcProtocol::_RolePerms(UserRole role)
|
||||
{
|
||||
switch (role) {
|
||||
case ROOM_HALFOP:
|
||||
return PERM_READ | PERM_WRITE | PERM_NICK | PERM_KICK
|
||||
| PERM_ROOM_SUBJECT;
|
||||
case IRC_OPERATOR:
|
||||
case ROOM_OPERATOR:
|
||||
return PERM_READ | PERM_WRITE | PERM_NICK | PERM_KICK | PERM_BAN
|
||||
| PERM_ROOM_SUBJECT | PERM_ROLECHANGE;
|
||||
}
|
||||
return PERM_READ | PERM_WRITE | PERM_NICK;
|
||||
}
|
||||
|
||||
|
||||
const char*
|
||||
IrcProtocol::_RoleTitle(UserRole role)
|
||||
{
|
||||
switch (role) {
|
||||
case ROOM_HALFOP:
|
||||
return B_TRANSLATE("Half-Op");
|
||||
case ROOM_OPERATOR:
|
||||
return B_TRANSLATE("Operator");
|
||||
case IRC_OPERATOR:
|
||||
return B_TRANSLATE("IRC Wizard");
|
||||
}
|
||||
return B_TRANSLATE("Member");
|
||||
}
|
||||
|
||||
|
||||
const char*
|
||||
IrcProtocol::_CachePath()
|
||||
{
|
||||
|
|
|
@ -12,6 +12,8 @@
|
|||
|
||||
#include <ChatProtocol.h>
|
||||
|
||||
#include "IrcConstants.h"
|
||||
|
||||
|
||||
typedef KeyMap<BString, BString> StringMap;
|
||||
|
||||
|
@ -96,6 +98,9 @@ private:
|
|||
void _LoadContacts();
|
||||
void _SaveContacts();
|
||||
|
||||
int32 _RolePerms(UserRole role);
|
||||
const char* _RoleTitle(UserRole role);
|
||||
|
||||
const char* _CachePath();
|
||||
const char* _ContactsCache();
|
||||
|
||||
|
|
Ŝarĝante…
Reference in New Issue