degesch: reset server info on disconnect
This commit is contained in:
parent
974ce75a59
commit
193dd36112
94
degesch.c
94
degesch.c
@ -1020,6 +1020,12 @@ enum server_state
|
||||
IRC_REGISTERED ///< We can chat now
|
||||
};
|
||||
|
||||
/// Convert an IRC identifier character to lower-case
|
||||
typedef int (*irc_tolower_fn) (int);
|
||||
|
||||
/// Key conversion function for hashmap lookups
|
||||
typedef size_t (*irc_strxfrm_fn) (char *, const char *, size_t);
|
||||
|
||||
struct server
|
||||
{
|
||||
struct app_context *ctx; ///< Application context
|
||||
@ -1064,11 +1070,8 @@ struct server
|
||||
|
||||
// Server-specific information (from RPL_ISUPPORT):
|
||||
|
||||
/// Convert an IRC identifier character to lower-case
|
||||
int (*irc_tolower) (int);
|
||||
|
||||
/// Key conversion function for hashmap lookups
|
||||
size_t (*irc_strxfrm) (char *, const char *, size_t);
|
||||
irc_tolower_fn irc_tolower; ///< Server tolower()
|
||||
irc_strxfrm_fn irc_strxfrm; ///< Server strxfrm()
|
||||
|
||||
char *irc_chantypes; ///< Channel types (name prefixes)
|
||||
char *irc_idchan_prefixes; ///< Prefixes for "safe channels"
|
||||
@ -1089,6 +1092,45 @@ static void on_irc_timeout (void *user_data);
|
||||
static void on_irc_ping_timeout (void *user_data);
|
||||
static void irc_initiate_connect (struct server *s);
|
||||
|
||||
static void
|
||||
server_init_specifics (struct server *self)
|
||||
{
|
||||
// Defaults as per the RPL_ISUPPORT drafts, or RFC 1459
|
||||
|
||||
self->irc_tolower = irc_tolower;
|
||||
self->irc_strxfrm = irc_strxfrm;
|
||||
|
||||
self->irc_chantypes = xstrdup ("#&");
|
||||
self->irc_idchan_prefixes = xstrdup ("");
|
||||
self->irc_statusmsg = xstrdup ("");
|
||||
|
||||
self->irc_chanmodes_list = xstrdup ("b");
|
||||
self->irc_chanmodes_param_always = xstrdup ("k");
|
||||
self->irc_chanmodes_param_when_set = xstrdup ("l");
|
||||
self->irc_chanmodes_param_never = xstrdup ("imnpst");
|
||||
|
||||
self->irc_chanuser_prefixes = xstrdup ("@+");
|
||||
self->irc_chanuser_modes = xstrdup ("ov");
|
||||
|
||||
self->irc_max_modes = 3;
|
||||
}
|
||||
|
||||
static void
|
||||
server_free_specifics (struct server *self)
|
||||
{
|
||||
free (self->irc_chantypes);
|
||||
free (self->irc_idchan_prefixes);
|
||||
free (self->irc_statusmsg);
|
||||
|
||||
free (self->irc_chanmodes_list);
|
||||
free (self->irc_chanmodes_param_always);
|
||||
free (self->irc_chanmodes_param_when_set);
|
||||
free (self->irc_chanmodes_param_never);
|
||||
|
||||
free (self->irc_chanuser_prefixes);
|
||||
free (self->irc_chanuser_modes);
|
||||
}
|
||||
|
||||
static void
|
||||
server_init (struct server *self, struct poller *poller)
|
||||
{
|
||||
@ -1119,23 +1161,8 @@ server_init (struct server *self, struct poller *poller)
|
||||
|
||||
str_init (&self->irc_user_mode);
|
||||
|
||||
// Defaults as per the RPL_ISUPPORT drafts, or RFC 1459
|
||||
self->irc_tolower = irc_tolower;
|
||||
self->irc_strxfrm = irc_strxfrm;
|
||||
|
||||
self->irc_chantypes = xstrdup ("#&");
|
||||
self->irc_idchan_prefixes = xstrdup ("");
|
||||
self->irc_statusmsg = xstrdup ("");
|
||||
|
||||
self->irc_chanmodes_list = xstrdup ("b");
|
||||
self->irc_chanmodes_param_always = xstrdup ("k");
|
||||
self->irc_chanmodes_param_when_set = xstrdup ("l");
|
||||
self->irc_chanmodes_param_never = xstrdup ("imnpst");
|
||||
|
||||
self->irc_chanuser_prefixes = xstrdup ("@+");
|
||||
self->irc_chanuser_modes = xstrdup ("ov");
|
||||
|
||||
self->irc_max_modes = 3;
|
||||
server_free_specifics (self);
|
||||
server_init_specifics (self);
|
||||
}
|
||||
|
||||
static void
|
||||
@ -1169,17 +1196,7 @@ server_free (struct server *self)
|
||||
str_free (&self->irc_user_mode);
|
||||
free (self->irc_user_host);
|
||||
|
||||
free (self->irc_chantypes);
|
||||
free (self->irc_idchan_prefixes);
|
||||
free (self->irc_statusmsg);
|
||||
|
||||
free (self->irc_chanmodes_list);
|
||||
free (self->irc_chanmodes_param_always);
|
||||
free (self->irc_chanmodes_param_when_set);
|
||||
free (self->irc_chanmodes_param_never);
|
||||
|
||||
free (self->irc_chanuser_prefixes);
|
||||
free (self->irc_chanuser_modes);
|
||||
server_free_specifics (self);
|
||||
}
|
||||
|
||||
static void
|
||||
@ -3208,9 +3225,18 @@ on_irc_disconnected (struct server *s)
|
||||
free (s->irc_user_host);
|
||||
s->irc_user_host = NULL;
|
||||
|
||||
// TODO: reset RPL_ISUPPORT information
|
||||
s->cap_echo_message = false;
|
||||
|
||||
irc_tolower_fn old_tolower = s->irc_tolower;
|
||||
irc_strxfrm_fn old_strxfrm = s->irc_strxfrm;
|
||||
server_free_specifics (s);
|
||||
server_init_specifics (s);
|
||||
// TODO: compare with the original functions and merge users and their
|
||||
// buffers as necessary; ideally we would never have to do this but
|
||||
// I can't think of any good workaround
|
||||
s->irc_tolower = old_tolower;
|
||||
s->irc_strxfrm = old_strxfrm;
|
||||
|
||||
// Take any relevant actions
|
||||
if (s->ctx->quitting)
|
||||
try_finish_quit (s->ctx);
|
||||
|
Loading…
Reference in New Issue
Block a user