(purple) Remove mod perms, command warnings

Since moderation commands are implemented per-protocol in libpurple
(with no easy way to use with the catch-all IM_ROOM_BAN_PARTICIPANT
message and corresponding command), the PERM_BAN, PERM_KICK, and a
couple other moderative perms aren't afforded to the user, disabling
these non-functional options in the UI.

The commands can still be implemented by the libpurple plugin, though.
If they aren't, purple will complain with some error message.
This commit is contained in:
Jaidyn Ann 2021-07-06 14:13:10 -05:00
parent 1515ab0d00
commit 735dda4188
2 changed files with 65 additions and 5 deletions

View File

@ -371,6 +371,55 @@ PurpleApp::ImMessage(BMessage* msg)
serv_reject_chat(purple_account_get_connection(account), data); serv_reject_chat(purple_account_get_connection(account), data);
break; break;
} }
case IM_ROOM_KICK_PARTICIPANT:
{
_SendSysText(_ConversationFromMessage(msg),
"** This protocol doesn't support kicking. "
"Send them a strongly worded e-mail.\n");
break;
}
case IM_ROOM_BAN_PARTICIPANT:
{
_SendSysText(_ConversationFromMessage(msg),
"** Banning won't work with this protocol. "
"Try being mean instead.\n");
break;
}
case IM_ROOM_UNBAN_PARTICIPANT:
{
_SendSysText(_ConversationFromMessage(msg),
"** You can't undo what was once done… "
"at least with this protocol.\n");
break;
}
case IM_ROOM_MUTE_PARTICIPANT:
{
_SendSysText(_ConversationFromMessage(msg),
"** This protocol left the duct-tape at home― "
"we have nothing to put over their mouth!\n");
break;
}
case IM_ROOM_UNMUTE_PARTICIPANT:
{
_SendSysText(_ConversationFromMessage(msg),
"** This protocol can't exactly unmute a user, let alone make "
" an omlett.\n");
break;
}
case IM_ROOM_DEAFEN_PARTICIPANT:
{
_SendSysText(_ConversationFromMessage(msg),
"** This protocol doesn't support deafening, but spamming the "
"chat should be a good substitute. :^)\n");
break;
}
case IM_ROOM_UNDEAFEN_PARTICIPANT:
{
_SendSysText(_ConversationFromMessage(msg),
"** This protocol is particularly self-concious, and prefers "
"that this person not see its chats.\n");
break;
}
case PURPLE_CHAT_COMMAND: case PURPLE_CHAT_COMMAND:
{ {
PurpleConversation* conv = _ConversationFromMessage(msg); PurpleConversation* conv = _ConversationFromMessage(msg);
@ -410,8 +459,7 @@ PurpleApp::ImMessage(BMessage* msg)
} }
if (status != PURPLE_CMD_STATUS_OK) { if (status != PURPLE_CMD_STATUS_OK) {
errorBody.ReplaceAll("%err%", error); errorBody.ReplaceAll("%err%", error);
errorMsg.AddString("body", errorBody); _SendSysText(conv, errorBody.String());
SendMessage(purple_conversation_get_account(conv), errorMsg);
} }
break; break;
} }
@ -446,6 +494,17 @@ PurpleApp::SendMessage(PurpleAccount* account, BMessage msg)
} }
void
PurpleApp::_SendSysText(PurpleConversation* conv, const char* body)
{
BMessage msg(IM_MESSAGE);
msg.AddInt32("im_what", IM_MESSAGE_RECEIVED);
msg.AddString("chat_id", purple_conversation_get_name(conv));
msg.AddString("body", body);
((PurpleApp*)be_app)->SendMessage(purple_conversation_get_account(conv), msg);
}
void void
PurpleApp::_GetProtocolsInfo() PurpleApp::_GetProtocolsInfo()
{ {
@ -1120,14 +1179,13 @@ send_user_role(PurpleConversation* conv, const char* name,
if (flags & PURPLE_CBFLAGS_OP) { if (flags & PURPLE_CBFLAGS_OP) {
if (role_title.IsEmpty() == true) if (role_title.IsEmpty() == true)
role_title = "Operator"; role_title = "Operator";
role_perms |= PERM_KICK | PERM_BAN | PERM_MUTE | PERM_DEAFEN role_perms |= PERM_ROOM_SUBJECT | PERM_ROOM_NAME;
| PERM_ROLECHANGE | PERM_ROOM_SUBJECT | PERM_ROOM_NAME;
role_priority = 2; role_priority = 2;
} }
if (flags & PURPLE_CBFLAGS_HALFOP) { if (flags & PURPLE_CBFLAGS_HALFOP) {
if (role_title.IsEmpty() == true) if (role_title.IsEmpty() == true)
role_title = "Moderator"; role_title = "Moderator";
role_perms |= PERM_KICK | PERM_MUTE | PERM_DEAFEN | PERM_ROOM_SUBJECT; role_perms |= PERM_ROOM_SUBJECT | PERM_ROOM_NAME;
role_priority = 3; role_priority = 3;
} }

View File

@ -84,6 +84,8 @@ public:
GHashList fInviteList; GHashList fInviteList;
private: private:
void _SendSysText(PurpleConversation* conv, const char* text);
void _GetProtocolsInfo(); void _GetProtocolsInfo();
void _SaveProtocolInfo(PurplePlugin* plugin); void _SaveProtocolInfo(PurplePlugin* plugin);