add plugin api for text commands

This commit is contained in:
Marvin W 2017-05-13 17:45:06 +02:00
parent 5dc460fc1a
commit 781d241b93
No known key found for this signature in database
GPG key ID: 072E9235DB996F2A
2 changed files with 34 additions and 9 deletions

View file

@ -6,6 +6,7 @@ public class Registry {
internal ArrayList<EncryptionListEntry> encryption_list_entries = new ArrayList<EncryptionListEntry>();
internal ArrayList<AccountSettingsEntry> account_settings_entries = new ArrayList<AccountSettingsEntry>();
internal ArrayList<ContactDetailsProvider> contact_details_entries = new ArrayList<ContactDetailsProvider>();
internal Map<string, TextCommand> text_commands = new HashMap<string, TextCommand>();
internal Gee.Collection<ConversationTitlebarEntry> conversation_titlebar_entries = new Gee.TreeSet<ConversationTitlebarEntry>((a, b) => {
if (a.order < b.order) {
return -1;
@ -49,6 +50,14 @@ public class Registry {
}
}
public bool register_text_command(TextCommand cmd) {
lock(text_commands) {
if (text_commands.has_key(cmd.cmd)) return false;
text_commands[cmd.cmd] = cmd;
return true;
}
}
public bool register_contact_titlebar_entry(ConversationTitlebarEntry entry) {
lock(conversation_titlebar_entries) {
foreach(ConversationTitlebarEntry e in conversation_titlebar_entries) {

View file

@ -52,30 +52,46 @@ public class View : Box {
private void send_text() {
string text = text_input.buffer.text;
text_input.buffer.text = "";
if (text.has_prefix("/")) {
string[] token = text.split(" ", 2);
switch(token[0]) {
case "/me":
// Just send as is.
break;
case "/say":
if (token.length == 1) return;
text = token[1];
break;
case "/kick":
stream_interactor.get_module(MucManager.IDENTITY).kick(conversation.account, conversation.counterpart, token[1]);
break;
case "/me":
stream_interactor.get_module(MessageProcessor.IDENTITY).send_message(text, conversation);
break;
return;
case "/nick":
stream_interactor.get_module(MucManager.IDENTITY).change_nick(conversation.account, conversation.counterpart, token[1]);
break;
return;
case "/ping":
Xmpp.Core.XmppStream? stream = stream_interactor.get_stream(conversation.account);
stream.get_module(Xmpp.Xep.Ping.Module.IDENTITY).send_ping(stream, conversation.counterpart.to_string() + "/" + token[1], null);
break;
return;
case "/topic":
stream_interactor.get_module(MucManager.IDENTITY).change_subject(conversation.account, conversation.counterpart, token[1]);
return;
default:
if (token[0].has_prefix("//")) {
text = text.substring(1);
} else {
string cmd_name = token[0].substring(1);
Dino.Application app = GLib.Application.get_default() as Dino.Application;
if (app != null && app.plugin_registry.text_commands.has_key(cmd_name)) {
string? new_text = app.plugin_registry.text_commands[cmd_name].handle_command(token[1], conversation);
if (new_text == null) return;
text = (!)new_text;
}
}
break;
}
} else {
stream_interactor.get_module(MessageProcessor.IDENTITY).send_message(text, conversation);
}
text_input.buffer.text = "";
stream_interactor.get_module(MessageProcessor.IDENTITY).send_message(text, conversation);
}
private bool on_text_input_key_press(EventKey event) {