diff --git a/GNUmakefile b/GNUmakefile index f46d315..6d0ffb0 100644 --- a/GNUmakefile +++ b/GNUmakefile @@ -209,6 +209,8 @@ plugin_auth_sqlite_SOURCES := src/plugins/mod_auth_sqlite.c plugin_auth_sqlite_TARGET := mod_auth_sqlite.so plugin_auth_sqlite_LIBS := -lsqlite3 +plugin_chat_history_SOURCE := src/plugins/mod_chat_history.c +plugin_chat_history_TARGET := mod_chat_history.so # Source to objects libuhub_OBJECTS := $(libuhub_SOURCES:.c=.o) @@ -221,7 +223,7 @@ adcrush_OBJECTS := $(adcrush_SOURCES:.c=.o) admin_OBJECTS := $(admin_SOURCES:.c=.o) all_OBJECTS := $(libuhub_OBJECTS) $(uhub_OBJECTS) $(libutils_OBJECTS) $(adcrush_OBJECTS) $(autotest_OBJECTS) $(admin_OBJECTS) $(libadc_common_OBJECTS) $(libadc_client_OBJECTS) -all_plugins := $(plugin_example_TARGET) $(plugin_logging_TARGET) $(plugin_auth_TARGET) $(plugin_auth_sqlite_TARGET) +all_plugins := $(plugin_example_TARGET) $(plugin_logging_TARGET) $(plugin_auth_TARGET) $(plugin_auth_sqlite_TARGET) $(plugin_chat_history_TARGET) uhub_BINARY=uhub$(BIN_EXT) adcrush_BINARY=adcrush$(BIN_EXT) @@ -253,6 +255,9 @@ $(plugin_example_TARGET): $(plugin_example_SOURCES) $(plugin_logging_TARGET): $(plugin_logging_SOURCES) $(libutils_OBJECTS) $(libadc_common_OBJECTS) src/network/network.o $(MSG_CC) $(CC) -shared -fPIC -o $@ $^ $(CFLAGS) +$(plugin_chat_history_TARGET): $(plugin_chat_history_SOURCE) $(libutils_OBJECTS) + $(MSG_CC) $(CC) -shared -fPIC -o $@ $^ $(CFLAGS) + $(adcrush_BINARY): $(adcrush_OBJECTS) $(libuhub_OBJECTS) $(libutils_OBJECTS) $(libadc_common_OBJECTS) $(libadc_client_OBJECTS) $(MSG_LD) $(CC) -o $@ $^ $(LDFLAGS) $(LDLIBS) diff --git a/src/core/pluginloader.c b/src/core/pluginloader.c index fec9256..b7413f6 100644 --- a/src/core/pluginloader.c +++ b/src/core/pluginloader.c @@ -65,6 +65,14 @@ void* plugin_lookup_symbol(struct uhub_plugin* plugin, const char* symbol) #endif } +static void plugin_register_hub_functions(struct plugin_handle* handle) +{ + handle->hub.send_message = NULL; + handle->hub.user_disconnect = NULL; + handle->hub.command_add = NULL; + handle->hub.command_del = NULL; +} + struct plugin_handle* plugin_load(const char* filename, const char* config) { plugin_register_f register_f; @@ -86,6 +94,8 @@ struct plugin_handle* plugin_load(const char* filename, const char* config) register_f = plugin_lookup_symbol(plugin, "plugin_register"); unregister_f = plugin_lookup_symbol(plugin, "plugin_unregister"); + plugin_register_hub_functions(handle); + if (register_f && unregister_f) { ret = register_f(handle, config); diff --git a/src/plugin_api/command_api.h b/src/plugin_api/command_api.h new file mode 100644 index 0000000..45fa6ee --- /dev/null +++ b/src/plugin_api/command_api.h @@ -0,0 +1,79 @@ +/* + * uhub - A tiny ADC p2p connection hub + * Copyright (C) 2007-2010, Jan Vidar Krey + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +#ifndef HAVE_UHUB_PLUGIN_API_H +#define HAVE_UHUB_PLUGIN_API_H + +/** + * This file describes the interface a plugin implementation may use from + * uhub. + */ + +#include "system.h" +#include "plugin_api/types.h" + +struct plugin_command +{ + const char* message; + char* prefix; + size_t prefix_len; + struct linked_list* args; +}; + +typedef int (*plugin_command_handler)(struct plugin_handle*, struct plugin_user* to, struct plugin_command*); + +struct plugin_command_handle +{ + void* internal_handle; /**<<< "Internal used by the hub only" */ + struct plugin_handle* handle; /**<<< "The plugin handle this is associated with" */ + const char* prefix; /**<<< "Command prefix, for instance 'help' would be the prefix for the !help command." */ + size_t length; /**<<< "Length of the prefix" */ + const char* args; /**<<< "Argument codes" */ + enum auth_credentials cred; /**<<< "Minimum access level for the command" */ + plugin_command_handler handler; /**<<< "Function pointer for the command" */ + const char* description; /**<<< "Description for the command" */ +}; + +#define PLUGIN_COMMAND_INITIALIZE(PTR, HANDLE, PREFIX, ARGS, CRED, CALLBACK, DESC) \ + do { \ + PTR->internal_handle = 0; \ + PTR->handle = HANDLE; \ + PTR->prefix = PREFIX; \ + PTR->length = strlen(PREFIX); \ + PTR->args = ARGS; \ + PTR->cred = CRED; \ + PTR->handler = CALLBACK; \ + PTR->description = DESC; \ + } while (0) + +extern int plugin_command_add(struct plugin_handle*, struct plugin_command_handle*); +extern int plugin_command_del(struct plugin_handle*, struct plugin_command_handle*); + +/** + * Send a message to a user. + * From the user's perspective the message will originate from the hub. + */ +extern int plugin_command_send_message(struct plugin_handle*, struct plugin_user* to, const char* message); + +/** + * Send a reply to a command. + */ +extern int plugin_command_send_reply(struct plugin_handle*, struct plugin_user* user, struct plugin_command* command, const char* message); + +#endif /* HAVE_UHUB_PLUGIN_API_H */ diff --git a/src/plugin_api/handle.h b/src/plugin_api/handle.h index 39d1e83..1e5b1b7 100644 --- a/src/plugin_api/handle.h +++ b/src/plugin_api/handle.h @@ -57,6 +57,9 @@ typedef plugin_st (*auth_register_user_t)(struct plugin_handle*, struct auth_inf typedef plugin_st (*auth_update_user_t)(struct plugin_handle*, struct auth_info* user); typedef plugin_st (*auth_delete_user_t)(struct plugin_handle*, struct auth_info* user); +/** + * These are callbacks used for the hub to invoke functions in plugins. + */ struct plugin_funcs { // Log events for connections @@ -89,6 +92,26 @@ struct plugin_funcs on_check_ip_late_t login_check_ip_late; }; +struct plugin_command_handle; + +typedef int (*hfunc_send_message)(struct plugin_handle*, struct plugin_user* user, const char* message); +typedef int (*hfunc_user_disconnect)(struct plugin_user* user); +typedef int (*hfunc_command_add)(struct plugin_handle*, struct plugin_command_handle*); +typedef int (*hfunc_command_del)(struct plugin_handle*, struct plugin_command_handle*); + +/** + * These are functions created and initialized by the hub and which can be used + * by plugins to access functionality internal to the hub. + */ +struct plugin_hub_funcs +{ + hfunc_send_message send_message; + hfunc_user_disconnect user_disconnect; + hfunc_command_add command_add; + hfunc_command_del command_del; +}; + + struct plugin_handle { struct uhub_plugin* handle; /* Must NOT be modified by the plugin */ @@ -99,7 +122,8 @@ struct plugin_handle const char* error_msg; /* Error message for registration error. */ size_t plugin_api_version; /* Plugin API version */ size_t plugin_funcs_size; /* Size of the plugin funcs */ - struct plugin_funcs funcs; + struct plugin_funcs funcs; /* Table of functions that can be implemented by a plugin */ + struct plugin_hub_funcs hub; /* Table of core hub functions that can be used by a plugin */ }; diff --git a/src/plugin_api/message_api.h b/src/plugin_api/message_api.h new file mode 100644 index 0000000..628805c --- /dev/null +++ b/src/plugin_api/message_api.h @@ -0,0 +1,29 @@ +/* + * uhub - A tiny ADC p2p connection hub + * Copyright (C) 2007-2010, Jan Vidar Krey + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +#ifndef HAVE_UHUB_PLUGIN_MESSAGE_API_H +#define HAVE_UHUB_PLUGIN_MESSAGE_API_H + +/** + * Send an informal message to a user. + * The user will see the message as if the hub sent it. + */ +extern int plugin_send_message(struct plugin_handle*, struct plugin_user* to, const char* message); + +#endif /* HAVE_UHUB_PLUGIN_API_H */