xC/xP: show own user's info in frontends
This commit is contained in:
parent
7806d4bd4e
commit
9327333813
16
xC-proto
16
xC-proto
@ -155,13 +155,25 @@ struct EventMessage {
|
|||||||
|
|
||||||
case SERVER_UPDATE:
|
case SERVER_UPDATE:
|
||||||
string server_name;
|
string server_name;
|
||||||
enum ServerState {
|
union ServerData switch (enum ServerState {
|
||||||
DISCONNECTED,
|
DISCONNECTED,
|
||||||
CONNECTING,
|
CONNECTING,
|
||||||
CONNECTED,
|
CONNECTED,
|
||||||
REGISTERED,
|
REGISTERED,
|
||||||
DISCONNECTING,
|
DISCONNECTING,
|
||||||
} state;
|
} state) {
|
||||||
|
case DISCONNECTED:
|
||||||
|
case CONNECTING:
|
||||||
|
case CONNECTED:
|
||||||
|
void;
|
||||||
|
case REGISTERED:
|
||||||
|
string user;
|
||||||
|
string user_mode;
|
||||||
|
// Theoretically, we could also send user information in this state,
|
||||||
|
// but we'd have to duplicate both fields.
|
||||||
|
case DISCONNECTING:
|
||||||
|
void;
|
||||||
|
} data;
|
||||||
case SERVER_RENAME:
|
case SERVER_RENAME:
|
||||||
// Buffers aren't sent updates for in this circumstance,
|
// Buffers aren't sent updates for in this circumstance,
|
||||||
// as that wouldn't be sufficiently atomic anyway.
|
// as that wouldn't be sufficiently atomic anyway.
|
||||||
|
37
xC.c
37
xC.c
@ -3067,6 +3067,9 @@ relay_server_state_for_server (struct server *s)
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// TODO: Consider pushing this whole block of code further down.
|
||||||
|
static char *irc_to_utf8 (const char *text);
|
||||||
|
|
||||||
static void
|
static void
|
||||||
relay_prepare_server_update (struct app_context *ctx, struct server *s)
|
relay_prepare_server_update (struct app_context *ctx, struct server *s)
|
||||||
{
|
{
|
||||||
@ -3074,7 +3077,17 @@ relay_prepare_server_update (struct app_context *ctx, struct server *s)
|
|||||||
struct relay_event_data_server_update *e = &m->data.server_update;
|
struct relay_event_data_server_update *e = &m->data.server_update;
|
||||||
e->event = RELAY_EVENT_SERVER_UPDATE;
|
e->event = RELAY_EVENT_SERVER_UPDATE;
|
||||||
e->server_name = str_from_cstr (s->name);
|
e->server_name = str_from_cstr (s->name);
|
||||||
e->state = relay_server_state_for_server (s);
|
e->data.state = relay_server_state_for_server (s);
|
||||||
|
if (s->state == IRC_REGISTERED)
|
||||||
|
{
|
||||||
|
char *user_utf8 = irc_to_utf8 (s->irc_user->nickname);
|
||||||
|
e->data.registered.user = str_from_cstr (user_utf8);
|
||||||
|
free (user_utf8);
|
||||||
|
|
||||||
|
char *user_mode_utf8 = irc_to_utf8 (s->irc_user_mode.str);
|
||||||
|
e->data.registered.user_mode = str_from_cstr (user_mode_utf8);
|
||||||
|
free (user_mode_utf8);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
@ -7071,6 +7084,9 @@ irc_handle_mode_user (struct server *s, char **params)
|
|||||||
{
|
{
|
||||||
struct mode_processor p = { .s = s };
|
struct mode_processor p = { .s = s };
|
||||||
mode_processor_run (&p, params, mode_processor_apply_user);
|
mode_processor_run (&p, params, mode_processor_apply_user);
|
||||||
|
|
||||||
|
relay_prepare_server_update (s->ctx, s);
|
||||||
|
relay_broadcast (s->ctx);
|
||||||
}
|
}
|
||||||
|
|
||||||
// --- Output processing -------------------------------------------------------
|
// --- Output processing -------------------------------------------------------
|
||||||
@ -7681,7 +7697,7 @@ irc_handle_nick (struct server *s, const struct irc_message *msg)
|
|||||||
if (lexicographically_different)
|
if (lexicographically_different)
|
||||||
hard_assert (!str_map_find (&s->irc_users, new_nickname));
|
hard_assert (!str_map_find (&s->irc_users, new_nickname));
|
||||||
|
|
||||||
// Now we can rename the PM buffer to reflect the new nickname
|
// Now we can rename everything to reflect the new nickname
|
||||||
if (pm_buffer)
|
if (pm_buffer)
|
||||||
{
|
{
|
||||||
str_map_set (&s->irc_buffer_map, user->nickname, NULL);
|
str_map_set (&s->irc_buffer_map, user->nickname, NULL);
|
||||||
@ -7692,8 +7708,17 @@ irc_handle_nick (struct server *s, const struct irc_message *msg)
|
|||||||
free (x);
|
free (x);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (irc_is_this_us (s, msg->prefix))
|
str_map_set (&s->irc_users, user->nickname, NULL);
|
||||||
|
str_map_set (&s->irc_users, new_nickname, user);
|
||||||
|
|
||||||
|
cstr_set (&user->nickname, xstrdup (new_nickname));
|
||||||
|
|
||||||
|
// Finally broadcast the event to relay clients and secondary buffers
|
||||||
|
if (irc_is_this_us (s, new_nickname))
|
||||||
{
|
{
|
||||||
|
relay_prepare_server_update (s->ctx, s);
|
||||||
|
relay_broadcast (s->ctx);
|
||||||
|
|
||||||
log_nick_self (s, s->buffer, new_nickname);
|
log_nick_self (s, s->buffer, new_nickname);
|
||||||
|
|
||||||
// Log a message in all open buffers on this server
|
// Log a message in all open buffers on this server
|
||||||
@ -7717,12 +7742,6 @@ irc_handle_nick (struct server *s, const struct irc_message *msg)
|
|||||||
log_nick (s, buffer, msg->prefix, new_nickname);
|
log_nick (s, buffer, msg->prefix, new_nickname);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Finally rename the user as it should be safe now
|
|
||||||
str_map_set (&s->irc_users, user->nickname, NULL);
|
|
||||||
str_map_set (&s->irc_users, new_nickname, user);
|
|
||||||
|
|
||||||
cstr_set (&user->nickname, xstrdup (new_nickname));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
|
@ -388,7 +388,7 @@ rpcEventHandlers.set(Relay.Event.ServerUpdate, e => {
|
|||||||
let s = servers.get(e.serverName)
|
let s = servers.get(e.serverName)
|
||||||
if (s === undefined)
|
if (s === undefined)
|
||||||
servers.set(e.serverName, (s = {}))
|
servers.set(e.serverName, (s = {}))
|
||||||
s.state = e.state
|
s.data = e.data
|
||||||
})
|
})
|
||||||
|
|
||||||
rpcEventHandlers.set(Relay.Event.ServerRename, e => {
|
rpcEventHandlers.set(Relay.Event.ServerRename, e => {
|
||||||
@ -693,14 +693,21 @@ let Status = {
|
|||||||
|
|
||||||
let Prompt = {
|
let Prompt = {
|
||||||
view: vnode => {
|
view: vnode => {
|
||||||
// This should be handled differently, so don't mind the lookup.
|
|
||||||
let b = buffers.get(bufferCurrent)
|
let b = buffers.get(bufferCurrent)
|
||||||
if (b === undefined || b.server === undefined)
|
if (b === undefined || b.server === undefined)
|
||||||
return
|
return
|
||||||
|
|
||||||
let state = b.server.state
|
if (b.server.data.user !== undefined) {
|
||||||
|
let user = b.server.data.user
|
||||||
|
if (b.server.data.userMode)
|
||||||
|
user += `(${b.server.data.userMode})`
|
||||||
|
return m('.prompt', {}, `${user}`)
|
||||||
|
}
|
||||||
|
|
||||||
|
// This might certainly be done more systematically.
|
||||||
|
let state = b.server.data.state
|
||||||
for (const s in Relay.ServerState)
|
for (const s in Relay.ServerState)
|
||||||
if (Relay.ServerState[s] == b.server.state) {
|
if (Relay.ServerState[s] == state) {
|
||||||
state = s
|
state = s
|
||||||
break
|
break
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user