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
|
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 server
|
||||||
{
|
{
|
||||||
struct app_context *ctx; ///< Application context
|
struct app_context *ctx; ///< Application context
|
||||||
|
@ -1064,11 +1070,8 @@ struct server
|
||||||
|
|
||||||
// Server-specific information (from RPL_ISUPPORT):
|
// Server-specific information (from RPL_ISUPPORT):
|
||||||
|
|
||||||
/// Convert an IRC identifier character to lower-case
|
irc_tolower_fn irc_tolower; ///< Server tolower()
|
||||||
int (*irc_tolower) (int);
|
irc_strxfrm_fn irc_strxfrm; ///< Server strxfrm()
|
||||||
|
|
||||||
/// Key conversion function for hashmap lookups
|
|
||||||
size_t (*irc_strxfrm) (char *, const char *, size_t);
|
|
||||||
|
|
||||||
char *irc_chantypes; ///< Channel types (name prefixes)
|
char *irc_chantypes; ///< Channel types (name prefixes)
|
||||||
char *irc_idchan_prefixes; ///< Prefixes for "safe channels"
|
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 on_irc_ping_timeout (void *user_data);
|
||||||
static void irc_initiate_connect (struct server *s);
|
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
|
static void
|
||||||
server_init (struct server *self, struct poller *poller)
|
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);
|
str_init (&self->irc_user_mode);
|
||||||
|
|
||||||
// Defaults as per the RPL_ISUPPORT drafts, or RFC 1459
|
server_free_specifics (self);
|
||||||
self->irc_tolower = irc_tolower;
|
server_init_specifics (self);
|
||||||
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
|
static void
|
||||||
|
@ -1169,17 +1196,7 @@ server_free (struct server *self)
|
||||||
str_free (&self->irc_user_mode);
|
str_free (&self->irc_user_mode);
|
||||||
free (self->irc_user_host);
|
free (self->irc_user_host);
|
||||||
|
|
||||||
free (self->irc_chantypes);
|
server_free_specifics (self);
|
||||||
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
|
static void
|
||||||
|
@ -3208,9 +3225,18 @@ on_irc_disconnected (struct server *s)
|
||||||
free (s->irc_user_host);
|
free (s->irc_user_host);
|
||||||
s->irc_user_host = NULL;
|
s->irc_user_host = NULL;
|
||||||
|
|
||||||
// TODO: reset RPL_ISUPPORT information
|
|
||||||
s->cap_echo_message = false;
|
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
|
// Take any relevant actions
|
||||||
if (s->ctx->quitting)
|
if (s->ctx->quitting)
|
||||||
try_finish_quit (s->ctx);
|
try_finish_quit (s->ctx);
|
||||||
|
|
Loading…
Reference in New Issue