Added triggers
This commit is contained in:
parent
53f7fb477b
commit
6fcc51746b
|
@ -16,7 +16,6 @@ struct _GmMcpIcecrewPlayerdbPrivate {
|
||||||
gint self;
|
gint self;
|
||||||
GList *db;
|
GList *db;
|
||||||
GList *last_init_keys;
|
GList *last_init_keys;
|
||||||
GList *signals;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
/* Signals */
|
/* Signals */
|
||||||
|
@ -112,7 +111,6 @@ gm_mcp_icecrew_playerdb_init(GmMcpIcecrewPlayerdb *obj) {
|
||||||
obj->priv->self = 0;
|
obj->priv->self = 0;
|
||||||
obj->priv->db = NULL;
|
obj->priv->db = NULL;
|
||||||
obj->priv->last_init_keys = NULL;
|
obj->priv->last_init_keys = NULL;
|
||||||
obj->priv->signals = NULL;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
GmMcpIcecrewPlayerdb *
|
GmMcpIcecrewPlayerdb *
|
||||||
|
@ -144,6 +142,11 @@ gm_playerdb_player_info_get_prop(GmPlayerdbPlayerInfo *ppi, gchar const *key) {
|
||||||
return g_hash_table_lookup(ppi->values, key);
|
return g_hash_table_lookup(ppi->values, key);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
gboolean
|
||||||
|
gm_mcp_icecrew_playerdb_initializing(GmMcpIcecrewPlayerdb *package) {
|
||||||
|
return package->priv->last_init_keys != NULL;
|
||||||
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
gm_mcp_icecrew_playerdb_find_players_with(GmMcpIcecrewPlayerdb *package,
|
gm_mcp_icecrew_playerdb_find_players_with(GmMcpIcecrewPlayerdb *package,
|
||||||
gchar const *key, gchar const *value, PlayerdbFindFunc func,
|
gchar const *key, gchar const *value, PlayerdbFindFunc func,
|
||||||
|
|
|
@ -69,6 +69,7 @@ gchar const *gm_playerdb_player_info_get_prop(GmPlayerdbPlayerInfo *ppi,
|
||||||
void gm_mcp_icecrew_playerdb_find_players_with(GmMcpIcecrewPlayerdb *package,
|
void gm_mcp_icecrew_playerdb_find_players_with(GmMcpIcecrewPlayerdb *package,
|
||||||
gchar const *key, gchar const *value, PlayerdbFindFunc func,
|
gchar const *key, gchar const *value, PlayerdbFindFunc func,
|
||||||
gpointer user_data);
|
gpointer user_data);
|
||||||
|
gboolean gm_mcp_icecrew_playerdb_initializing(GmMcpIcecrewPlayerdb *package);
|
||||||
|
|
||||||
G_END_DECLS
|
G_END_DECLS
|
||||||
#endif /* __GM_MCP_ICECREW_PLAYERDB_H__ */
|
#endif /* __GM_MCP_ICECREW_PLAYERDB_H__ */
|
||||||
|
|
|
@ -13,6 +13,7 @@
|
||||||
#include "../gm-marshal.h"
|
#include "../gm-marshal.h"
|
||||||
#include "../gm-debug.h"
|
#include "../gm-debug.h"
|
||||||
#include "../gm-world.h"
|
#include "../gm-world.h"
|
||||||
|
#include "../gm-triggers.h"
|
||||||
|
|
||||||
#define GM_MCP_ICECREW_USERLIST_GET_PRIVATE(object)( \
|
#define GM_MCP_ICECREW_USERLIST_GET_PRIVATE(object)( \
|
||||||
G_TYPE_INSTANCE_GET_PRIVATE((object), \
|
G_TYPE_INSTANCE_GET_PRIVATE((object), \
|
||||||
|
@ -21,19 +22,19 @@
|
||||||
#define USERLIST_ICON_SIZE 22
|
#define USERLIST_ICON_SIZE 22
|
||||||
|
|
||||||
static GmKeyValuePair default_states[] = {
|
static GmKeyValuePair default_states[] = {
|
||||||
{"away+idle", "ice-userlist/away+idle.svg"},
|
{"away+idle", "ice-userlist/away+idle.svg"},
|
||||||
{"busy+idle", "ice-userlist/busy+idle.svg"},
|
{"busy+idle", "ice-userlist/busy+idle.svg"},
|
||||||
{"away", "ice-userlist/away.svg"},
|
{"away", "ice-userlist/away.svg"},
|
||||||
{"busy", "ice-userlist/busy.svg"},
|
{"busy", "ice-userlist/busy.svg"},
|
||||||
{"avail+idle", "ice-userlist/avail+idle.svg"},
|
{"avail+idle", "ice-userlist/avail+idle.svg"},
|
||||||
{NULL, NULL}
|
{NULL, NULL}
|
||||||
};
|
};
|
||||||
|
|
||||||
static GmKeyValuePair default_ranks[] = {
|
static GmKeyValuePair default_ranks[] = {
|
||||||
{"inhabitant", "ice-userlist/inhabitant.svg"},
|
{"inhabitant", "ice-userlist/inhabitant.svg"},
|
||||||
{"programmer", "ice-userlist/programmer.svg"},
|
{"programmer", "ice-userlist/programmer.svg"},
|
||||||
{"wizard", "ice-userlist/wizard.svg"},
|
{"wizard", "ice-userlist/wizard.svg"},
|
||||||
{NULL, NULL}
|
{NULL, NULL}
|
||||||
};
|
};
|
||||||
|
|
||||||
struct _GmMcpIcecrewUserlistPrivate {
|
struct _GmMcpIcecrewUserlistPrivate {
|
||||||
|
@ -48,6 +49,8 @@ struct _GmMcpIcecrewUserlistPrivate {
|
||||||
|
|
||||||
gchar *rank_dir;
|
gchar *rank_dir;
|
||||||
gchar *state_dir;
|
gchar *state_dir;
|
||||||
|
|
||||||
|
gboolean initializing;
|
||||||
};
|
};
|
||||||
|
|
||||||
static gchar *gm_mcp_icecrew_userlist_depends[] = {
|
static gchar *gm_mcp_icecrew_userlist_depends[] = {
|
||||||
|
@ -754,6 +757,40 @@ gm_mcp_icecrew_userlist_fetch_progress(GmFetchHandle *g,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#define MAX_MATCHES 10
|
||||||
|
|
||||||
|
void
|
||||||
|
gm_mcp_icecrew_userlist_process_triggers(GmMcpIcecrewUserlist *package,
|
||||||
|
gchar const *username, GmTriggerConditionType condition) {
|
||||||
|
GmWorld *world;
|
||||||
|
GmTriggers *triggers;
|
||||||
|
GList const *item;
|
||||||
|
GmTrigger *trigger;
|
||||||
|
regmatch_t matches[MAX_MATCHES];
|
||||||
|
GmMcpPackage *playerdb = gm_mcp_session_find_package(
|
||||||
|
GM_MCP_PACKAGE_SESSION(package), "dns-nl-icecrew-playerdb");
|
||||||
|
|
||||||
|
if (gm_mcp_icecrew_playerdb_initializing(
|
||||||
|
GM_MCP_ICECREW_PLAYERDB(playerdb))) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
world = GM_MCP_SESSION_WORLD(GM_MCP_PACKAGE_SESSION(package));
|
||||||
|
triggers = gm_world_triggers(world);
|
||||||
|
|
||||||
|
for (item = gm_triggers_list(triggers); item; item = item->next) {
|
||||||
|
trigger = (GmTrigger *)(item->data);
|
||||||
|
|
||||||
|
if (trigger->event == TT_USERS) {
|
||||||
|
if (gm_trigger_match_user(trigger, username, condition, matches,
|
||||||
|
MAX_MATCHES)) {
|
||||||
|
gm_world_apply_trigger(world, trigger, username, matches);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
gm_mcp_icecrew_userlist_handle_ranks_states(GmMcpIcecrewUserlist *package,
|
gm_mcp_icecrew_userlist_handle_ranks_states(GmMcpIcecrewUserlist *package,
|
||||||
GList *values, gboolean rank) {
|
GList *values, gboolean rank) {
|
||||||
|
@ -944,6 +981,36 @@ gm_mcp_icecrew_userlist_create_view(GmMcpPackage *package, GObject *parent) {
|
||||||
gm_mcp_userlist_view_new(package, parent);
|
gm_mcp_userlist_view_new(package, parent);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
gm_mcp_icecrew_userlist_process_state_changed(GmMcpIcecrewUserlist *userlist,
|
||||||
|
GmPlayerdbPlayerInfo *ppi, gchar const *value, gchar const *old) {
|
||||||
|
gboolean was_away, was_idle;
|
||||||
|
gboolean is_away, is_idle;
|
||||||
|
gchar const *name = gm_playerdb_player_info_get_prop(ppi, "P_NAME");
|
||||||
|
|
||||||
|
was_away = (strstr(old, "away") != NULL || strstr(old, "busy") != NULL);
|
||||||
|
was_idle = (strstr(old, "idle") != NULL);
|
||||||
|
|
||||||
|
is_away = (strstr(value, "away") != NULL || strstr(value, "busy") != NULL);
|
||||||
|
is_idle = (strstr(value, "idle") != NULL);
|
||||||
|
|
||||||
|
if (was_away && !is_away) {
|
||||||
|
gm_mcp_icecrew_userlist_process_triggers(userlist, name,
|
||||||
|
TCT_USER_AWAY_OFF);
|
||||||
|
} else if (!was_away && is_away) {
|
||||||
|
gm_mcp_icecrew_userlist_process_triggers(userlist, name,
|
||||||
|
TCT_USER_AWAY);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (was_idle && !is_idle) {
|
||||||
|
gm_mcp_icecrew_userlist_process_triggers(userlist, name,
|
||||||
|
TCT_USER_IDLE_OFF);
|
||||||
|
} else if (!was_idle && is_idle) {
|
||||||
|
gm_mcp_icecrew_userlist_process_triggers(userlist, name,
|
||||||
|
TCT_USER_IDLE);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/* Callbacks */
|
/* Callbacks */
|
||||||
void
|
void
|
||||||
on_gm_mcp_icecrew_userlist_add(GmMcpIcecrewPlayerdb *playerdb,
|
on_gm_mcp_icecrew_userlist_add(GmMcpIcecrewPlayerdb *playerdb,
|
||||||
|
@ -954,6 +1021,7 @@ on_gm_mcp_icecrew_userlist_add(GmMcpIcecrewPlayerdb *playerdb,
|
||||||
|
|
||||||
g_signal_emit(userlist, gm_mcp_icecrew_userlist_signals[PLAYER_ADDED],
|
g_signal_emit(userlist, gm_mcp_icecrew_userlist_signals[PLAYER_ADDED],
|
||||||
0, ppi->id, name, icon_path, sort);
|
0, ppi->id, name, icon_path, sort);
|
||||||
|
gm_mcp_icecrew_userlist_process_triggers(userlist, name, TCT_USER_ONLINE);
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
|
@ -963,11 +1031,13 @@ on_gm_mcp_icecrew_userlist_set(GmMcpIcecrewPlayerdb *playerdb,
|
||||||
gchar *sort = NULL;
|
gchar *sort = NULL;
|
||||||
|
|
||||||
if (strcmp(key, "P_STATE") == 0) {
|
if (strcmp(key, "P_STATE") == 0) {
|
||||||
sort = gm_mcp_icecrew_userlist_sort_string(userlist, ppi);
|
sort = gm_mcp_icecrew_userlist_sort_string(userlist, ppi);
|
||||||
|
|
||||||
g_signal_emit(userlist, gm_mcp_icecrew_userlist_signals[STATE_CHANGED],
|
g_signal_emit(userlist, gm_mcp_icecrew_userlist_signals[STATE_CHANGED],
|
||||||
0, ppi->id, gm_mcp_icecrew_userlist_icon_path(userlist, ppi),
|
0, ppi->id, gm_mcp_icecrew_userlist_icon_path(userlist, ppi),
|
||||||
sort);
|
sort);
|
||||||
|
|
||||||
|
gm_mcp_icecrew_userlist_process_state_changed(userlist, ppi, value,
|
||||||
|
old);
|
||||||
} else if (strcmp(key, "P_RANK") == 0) {
|
} else if (strcmp(key, "P_RANK") == 0) {
|
||||||
sort = gm_mcp_icecrew_userlist_sort_string(userlist, ppi);
|
sort = gm_mcp_icecrew_userlist_sort_string(userlist, ppi);
|
||||||
|
|
||||||
|
@ -985,6 +1055,9 @@ on_gm_mcp_icecrew_userlist_set(GmMcpIcecrewPlayerdb *playerdb,
|
||||||
void
|
void
|
||||||
on_gm_mcp_icecrew_userlist_delete(GmMcpIcecrewPlayerdb *playerdb,
|
on_gm_mcp_icecrew_userlist_delete(GmMcpIcecrewPlayerdb *playerdb,
|
||||||
GmPlayerdbPlayerInfo *ppi, GmMcpIcecrewUserlist *userlist) {
|
GmPlayerdbPlayerInfo *ppi, GmMcpIcecrewUserlist *userlist) {
|
||||||
|
gchar const *name = gm_playerdb_player_info_get_prop(ppi, "P_NAME");
|
||||||
|
|
||||||
g_signal_emit(userlist, gm_mcp_icecrew_userlist_signals[PLAYER_REMOVED],
|
g_signal_emit(userlist, gm_mcp_icecrew_userlist_signals[PLAYER_REMOVED],
|
||||||
0, ppi->id);
|
0, ppi->id);
|
||||||
|
gm_mcp_icecrew_userlist_process_triggers(userlist, name, TCT_USER_OFFLINE);
|
||||||
}
|
}
|
||||||
|
|
|
@ -44,6 +44,8 @@ struct _GmMcpVmooUserlistPrivate {
|
||||||
GList *fields;
|
GList *fields;
|
||||||
GList *icons;
|
GList *icons;
|
||||||
GList *users;
|
GList *users;
|
||||||
|
|
||||||
|
gboolean initializing;
|
||||||
};
|
};
|
||||||
|
|
||||||
/* Signals */
|
/* Signals */
|
||||||
|
@ -204,6 +206,37 @@ gm_mcp_vmoo_userlist_new() {
|
||||||
return obj;
|
return obj;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#define MAX_MATCHES 10
|
||||||
|
|
||||||
|
void
|
||||||
|
gm_mcp_vmoo_userlist_process_triggers(GmMcpVmooUserlist *package,
|
||||||
|
gchar const *username, GmTriggerConditionType condition) {
|
||||||
|
GmWorld *world;
|
||||||
|
GmTriggers *triggers;
|
||||||
|
GList const *item;
|
||||||
|
GmTrigger *trigger;
|
||||||
|
regmatch_t matches[MAX_MATCHES];
|
||||||
|
|
||||||
|
if (package->priv->initializing) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
world = GM_MCP_SESSION_WORLD(GM_MCP_PACKAGE_SESSION(package));
|
||||||
|
triggers = gm_world_triggers(world);
|
||||||
|
|
||||||
|
for (item = gm_triggers_list(triggers); item; item = item->next) {
|
||||||
|
trigger = (GmTrigger *)(item->data);
|
||||||
|
|
||||||
|
if (trigger->event == TT_USERS) {
|
||||||
|
if (gm_trigger_match_user(trigger, username, condition, matches,
|
||||||
|
MAX_MATCHES)) {
|
||||||
|
gm_world_apply_trigger(world, trigger, username, matches);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
gm_mcp_vmoo_userlist_handle_fields(GmMcpVmooUserlist *package, MOOVar *list) {
|
gm_mcp_vmoo_userlist_handle_fields(GmMcpVmooUserlist *package, MOOVar *list) {
|
||||||
MOOVar *field;
|
MOOVar *field;
|
||||||
|
@ -335,6 +368,9 @@ gm_mcp_vmoo_userlist_remove_user(GmMcpVmooUserlist *package, gint nr) {
|
||||||
ui = (UserInfo *) (elem->data);
|
ui = (UserInfo *) (elem->data);
|
||||||
|
|
||||||
if (ui->nr == nr) {
|
if (ui->nr == nr) {
|
||||||
|
gm_mcp_vmoo_userlist_process_triggers(package, ui->name,
|
||||||
|
TCT_USER_OFFLINE);
|
||||||
|
|
||||||
package->priv->users = g_list_remove(package->priv->users, ui);
|
package->priv->users = g_list_remove(package->priv->users, ui);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
@ -389,6 +425,9 @@ gm_mcp_vmoo_userlist_handle_user_update(GmMcpVmooUserlist *package, MOOVar *v) {
|
||||||
g_signal_emit(package, gm_mcp_vmoo_userlist_signals[PLAYER_ADDED], 0,
|
g_signal_emit(package, gm_mcp_vmoo_userlist_signals[PLAYER_ADDED], 0,
|
||||||
nr, name, gm_mcp_vmoo_userlist_get_icon(package, ui), sort);
|
nr, name, gm_mcp_vmoo_userlist_get_icon(package, ui), sort);
|
||||||
g_free(sort);
|
g_free(sort);
|
||||||
|
|
||||||
|
gm_mcp_vmoo_userlist_process_triggers(package, ui->name,
|
||||||
|
TCT_USER_ONLINE);
|
||||||
} else {
|
} else {
|
||||||
if (ui->name || strcmp(ui->name, name) != 0) {
|
if (ui->name || strcmp(ui->name, name) != 0) {
|
||||||
g_free(ui->name);
|
g_free(ui->name);
|
||||||
|
@ -420,6 +459,7 @@ gm_mcp_vmoo_userlist_handle_set(GmMcpVmooUserlist *package, MOOVar *v) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
package->priv->initializing = TRUE;
|
||||||
gm_mcp_vmoo_userlist_remove_users(package);
|
gm_mcp_vmoo_userlist_remove_users(package);
|
||||||
|
|
||||||
for (ui = v->list; ui; ui = ui->next) {
|
for (ui = v->list; ui; ui = ui->next) {
|
||||||
|
@ -429,6 +469,8 @@ gm_mcp_vmoo_userlist_handle_set(GmMcpVmooUserlist *package, MOOVar *v) {
|
||||||
|
|
||||||
gm_mcp_vmoo_userlist_handle_user_update(package, ui->list);
|
gm_mcp_vmoo_userlist_handle_user_update(package, ui->list);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
package->priv->initializing = FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
|
@ -470,6 +512,7 @@ gm_mcp_vmoo_userlist_handle_state(GmMcpVmooUserlist *package, MOOVar *v,
|
||||||
MOOVar *nr;
|
MOOVar *nr;
|
||||||
UserInfo *u;
|
UserInfo *u;
|
||||||
gchar *sort;
|
gchar *sort;
|
||||||
|
GmTriggerConditionType condition = 0;
|
||||||
|
|
||||||
if (v->type != LIST) {
|
if (v->type != LIST) {
|
||||||
return;
|
return;
|
||||||
|
@ -489,6 +532,12 @@ gm_mcp_vmoo_userlist_handle_state(GmMcpVmooUserlist *package, MOOVar *v,
|
||||||
} else if (u->state == U_IDLE) {
|
} else if (u->state == U_IDLE) {
|
||||||
u->state = U_NORMAL;
|
u->state = U_NORMAL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (onOff) {
|
||||||
|
condition = TCT_USER_IDLE;
|
||||||
|
} else {
|
||||||
|
condition = TCT_USER_IDLE_OFF;
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
case U_AWAY:
|
case U_AWAY:
|
||||||
if (u->state == U_IDLEAWAY && !onOff) {
|
if (u->state == U_IDLEAWAY && !onOff) {
|
||||||
|
@ -500,16 +549,28 @@ gm_mcp_vmoo_userlist_handle_state(GmMcpVmooUserlist *package, MOOVar *v,
|
||||||
} else if (u->state == U_AWAY) {
|
} else if (u->state == U_AWAY) {
|
||||||
u->state = U_NORMAL;
|
u->state = U_NORMAL;
|
||||||
}
|
}
|
||||||
break;
|
|
||||||
|
if (onOff) {
|
||||||
|
condition = TCT_USER_AWAY;
|
||||||
|
} else {
|
||||||
|
condition = TCT_USER_AWAY_OFF;
|
||||||
|
}
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
sort = gm_mcp_vmoo_userlist_sort_string(package, u);
|
sort = gm_mcp_vmoo_userlist_sort_string(package, u);
|
||||||
|
|
||||||
g_signal_emit(package,
|
g_signal_emit(package,
|
||||||
gm_mcp_vmoo_userlist_signals[STATE_CHANGED], 0,
|
gm_mcp_vmoo_userlist_signals[STATE_CHANGED], 0,
|
||||||
nr->i, gm_mcp_vmoo_userlist_get_icon(package, u), sort);
|
nr->i, gm_mcp_vmoo_userlist_get_icon(package, u), sort);
|
||||||
|
|
||||||
|
if (condition != 0) {
|
||||||
|
gm_mcp_vmoo_userlist_process_triggers(package, u->name,
|
||||||
|
condition);
|
||||||
|
}
|
||||||
|
|
||||||
g_free(sort);
|
g_free(sort);
|
||||||
} else {
|
} else {
|
||||||
GM_DEBUG("User %d does not exist!", nr->i);
|
GM_DEBUG("User %d does not exist!", nr->i);
|
||||||
|
|
Reference in New Issue