Create a bot user system.
This commit is contained in:
parent
f91f3ea68c
commit
70ba9d5831
|
@ -806,6 +806,19 @@ static void unload_ssl_certificates(struct hub_info* hub)
|
||||||
}
|
}
|
||||||
#endif /* SSL_SUPPORT */
|
#endif /* SSL_SUPPORT */
|
||||||
|
|
||||||
|
// #ifdef BOT_SUPPORT
|
||||||
|
|
||||||
|
static void hub_bot_op_notify_handle(struct hub_user* bot, struct adc_message* msg)
|
||||||
|
{
|
||||||
|
LOG_INFO("Invoked hub_bot_op_notify_handle()");
|
||||||
|
}
|
||||||
|
|
||||||
|
static void hub_bot_op_notify_create(struct hub_info* hub)
|
||||||
|
{
|
||||||
|
struct hub_user* opcom = user_create_bot(hub, "Operations", "Hub operators", hub_bot_op_notify_handle);
|
||||||
|
}
|
||||||
|
// #endif
|
||||||
|
|
||||||
struct hub_info* hub_start_service(struct hub_config* config)
|
struct hub_info* hub_start_service(struct hub_config* config)
|
||||||
{
|
{
|
||||||
struct hub_info* hub = 0;
|
struct hub_info* hub = 0;
|
||||||
|
@ -889,6 +902,8 @@ struct hub_info* hub_start_service(struct hub_config* config)
|
||||||
|
|
||||||
// Start the hub command sub-system
|
// Start the hub command sub-system
|
||||||
hub->commands = command_initialize(hub);
|
hub->commands = command_initialize(hub);
|
||||||
|
|
||||||
|
hub_bot_op_notify_create(hub);
|
||||||
return hub;
|
return hub;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -104,7 +104,7 @@ static int cbfunc_command_add(struct plugin_handle* plugin, struct plugin_comman
|
||||||
cmdh->internal_handle = command;
|
cmdh->internal_handle = command;
|
||||||
list_append(data->commands, cmdh);
|
list_append(data->commands, cmdh);
|
||||||
command_add(plugin_get_hub(plugin)->commands, command, (void*) plugin);
|
command_add(plugin_get_hub(plugin)->commands, command, (void*) plugin);
|
||||||
printf("*** Add plugin command: %s (%p, %p)\n", command->prefix, command, cmdh);
|
LOG_DEBUG("*** Add plugin command: %s (%p, %p)\n", command->prefix, command, cmdh);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -113,7 +113,7 @@ static int cbfunc_command_del(struct plugin_handle* plugin, struct plugin_comman
|
||||||
struct plugin_callback_data* data = get_callback_data(plugin);
|
struct plugin_callback_data* data = get_callback_data(plugin);
|
||||||
struct command_handle* command = (struct command_handle*) cmdh->internal_handle;
|
struct command_handle* command = (struct command_handle*) cmdh->internal_handle;
|
||||||
|
|
||||||
printf("*** Del plugin command: %s (%p, %p)\n", command->prefix, command, cmdh);
|
LOG_DEBUG("*** Del plugin command: %s (%p, %p)\n", command->prefix, command, cmdh);
|
||||||
list_remove(data->commands, cmdh);
|
list_remove(data->commands, cmdh);
|
||||||
command_del(plugin_get_hub(plugin)->commands, command);
|
command_del(plugin_get_hub(plugin)->commands, command);
|
||||||
hub_free(command);
|
hub_free(command);
|
||||||
|
|
|
@ -104,7 +104,19 @@ int route_to_user(struct hub_info* hub, struct hub_user* user, struct adc_messag
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
if (!user->connection)
|
if (!user->connection)
|
||||||
return 0;
|
{
|
||||||
|
switch (user->type)
|
||||||
|
{
|
||||||
|
case user_type_client:
|
||||||
|
return 0; // No connection - we're about to drop this user.
|
||||||
|
case user_type_bot:
|
||||||
|
{
|
||||||
|
bot_recv_msg handler = (bot_recv_msg) user->ptr;
|
||||||
|
handler(user, msg);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
uhub_assert(msg->cache && *msg->cache);
|
uhub_assert(msg->cache && *msg->cache);
|
||||||
|
|
||||||
|
|
|
@ -42,7 +42,6 @@ struct hub_user* user_create(struct hub_info* hub, struct net_connection* con, s
|
||||||
LOG_TRACE("user_create(), hub=%p, con[sd=%d]", hub, net_con_get_sd(con));
|
LOG_TRACE("user_create(), hub=%p, con[sd=%d]", hub, net_con_get_sd(con));
|
||||||
|
|
||||||
user = (struct hub_user*) hub_malloc_zero(sizeof(struct hub_user));
|
user = (struct hub_user*) hub_malloc_zero(sizeof(struct hub_user));
|
||||||
|
|
||||||
if (user == NULL)
|
if (user == NULL)
|
||||||
return NULL; /* OOM */
|
return NULL; /* OOM */
|
||||||
|
|
||||||
|
@ -54,6 +53,7 @@ struct hub_user* user_create(struct hub_info* hub, struct net_connection* con, s
|
||||||
|
|
||||||
memcpy(&user->id.addr, addr, sizeof(struct ip_addr_encap));
|
memcpy(&user->id.addr, addr, sizeof(struct ip_addr_encap));
|
||||||
user_set_state(user, state_protocol);
|
user_set_state(user, state_protocol);
|
||||||
|
user->type = user_type_client;
|
||||||
|
|
||||||
flood_control_reset(&user->flood_chat);
|
flood_control_reset(&user->flood_chat);
|
||||||
flood_control_reset(&user->flood_connect);
|
flood_control_reset(&user->flood_connect);
|
||||||
|
@ -65,6 +65,38 @@ struct hub_user* user_create(struct hub_info* hub, struct net_connection* con, s
|
||||||
return user;
|
return user;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
struct hub_user* user_create_bot(struct hub_info* hub, const char* nick, const char* description, bot_recv_msg msg_handler)
|
||||||
|
{
|
||||||
|
struct hub_user* user = NULL;
|
||||||
|
LOG_TRACE("user_create_bot(), hub=%p, con[sd=%d]", hub, net_con_get_sd(con));
|
||||||
|
|
||||||
|
user = (struct hub_user*) hub_malloc_zero(sizeof(struct hub_user));
|
||||||
|
if (user == NULL)
|
||||||
|
return NULL; /* OOM */
|
||||||
|
|
||||||
|
strcpy(user->id.nick, nick);
|
||||||
|
uman_get_free_sid(hub->users, user);
|
||||||
|
|
||||||
|
user_set_state(user, state_normal);
|
||||||
|
user->type = user_type_bot;
|
||||||
|
user->credentials = auth_cred_bot;
|
||||||
|
|
||||||
|
// The message handler
|
||||||
|
user->ptr = (void*) msg_handler;
|
||||||
|
|
||||||
|
user->info = adc_msg_construct(ADC_CMD_BINF, 15);
|
||||||
|
if (user->info)
|
||||||
|
{
|
||||||
|
adc_msg_add_argument(user->info, sid_to_string(user->id.sid));
|
||||||
|
adc_msg_add_named_argument(user->info, ADC_INF_FLAG_CLIENT_TYPE, ADC_CLIENT_TYPE_BOT);
|
||||||
|
adc_msg_add_named_argument_string(user->info, ADC_INF_FLAG_USER_AGENT, PRODUCT_STRING);
|
||||||
|
adc_msg_add_named_argument_string(user->info, ADC_INF_FLAG_NICK, nick);
|
||||||
|
adc_msg_add_named_argument_string(user->info, ADC_INF_FLAG_DESCRIPTION, description);
|
||||||
|
}
|
||||||
|
|
||||||
|
user->hub = hub;
|
||||||
|
return user;
|
||||||
|
}
|
||||||
|
|
||||||
void user_destroy(struct hub_user* user)
|
void user_destroy(struct hub_user* user)
|
||||||
{
|
{
|
||||||
|
|
|
@ -105,21 +105,30 @@ struct hub_user_limits
|
||||||
size_t hub_count_total; /** The number of hubs connected to in total */
|
size_t hub_count_total; /** The number of hubs connected to in total */
|
||||||
};
|
};
|
||||||
|
|
||||||
|
enum user_type
|
||||||
|
{
|
||||||
|
user_type_client, /** A user connected normally as an ADC client */
|
||||||
|
user_type_bot, /** Not really a user, but a bot inside the hub */
|
||||||
|
};
|
||||||
|
|
||||||
|
typedef void (*bot_recv_msg)(struct hub_user*, struct adc_message* msg);
|
||||||
|
|
||||||
struct hub_user
|
struct hub_user
|
||||||
{
|
{
|
||||||
struct hub_user_info id; /** Contains nick name and CID */
|
struct hub_user_info id; /** Contains nick name and CID */
|
||||||
enum auth_credentials credentials; /** see enum user_credentials */
|
enum auth_credentials credentials; /** see enum user_credentials */
|
||||||
enum user_state state; /** see enum user_state */
|
enum user_state state; /** see enum user_state */
|
||||||
|
enum user_type type;
|
||||||
uint32_t flags; /** see enum user_flags */
|
uint32_t flags; /** see enum user_flags */
|
||||||
struct linked_list* feature_cast; /** Features supported by feature cast */
|
struct linked_list* feature_cast; /** Features supported by feature cast */
|
||||||
struct adc_message* info; /** ADC 'INF' message (broadcasted to everyone joining the hub) */
|
struct adc_message* info; /** ADC 'INF' message (broadcasted to everyone joining the hub) */
|
||||||
struct hub_info* hub; /** The hub instance this user belong to */
|
struct hub_info* hub; /** The hub instance this user belong to */
|
||||||
|
void* ptr;
|
||||||
struct ioq_recv* recv_queue;
|
struct ioq_recv* recv_queue;
|
||||||
struct ioq_send* send_queue;
|
struct ioq_send* send_queue;
|
||||||
struct net_connection* connection; /** Connection data */
|
struct net_connection* connection; /** Connection data */
|
||||||
struct hub_user_limits limits; /** Data used for limitation */
|
struct hub_user_limits limits; /** Data used for limitation */
|
||||||
enum user_quit_reason quit_reason; /** Quit reason (see user_quit_reason) */
|
enum user_quit_reason quit_reason; /** Quit reason (see user_quit_reason) */
|
||||||
|
|
||||||
struct flood_control flood_chat;
|
struct flood_control flood_chat;
|
||||||
struct flood_control flood_connect;
|
struct flood_control flood_connect;
|
||||||
struct flood_control flood_search;
|
struct flood_control flood_search;
|
||||||
|
@ -139,6 +148,7 @@ struct hub_user
|
||||||
* @return User object or NULL if not enough memory is available.
|
* @return User object or NULL if not enough memory is available.
|
||||||
*/
|
*/
|
||||||
extern struct hub_user* user_create(struct hub_info* hub, struct net_connection* con, struct ip_addr_encap* addr);
|
extern struct hub_user* user_create(struct hub_info* hub, struct net_connection* con, struct ip_addr_encap* addr);
|
||||||
|
extern struct hub_user* user_create_bot(struct hub_info* hub, const char* nick, const char* description, bot_recv_msg msg_handler);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Delete a user.
|
* Delete a user.
|
||||||
|
|
Loading…
Reference in New Issue