aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--account.c8
-rw-r--r--chat.c25
-rw-r--r--chat.h1
-rw-r--r--root_commands.c17
4 files changed, 51 insertions, 0 deletions
diff --git a/account.c b/account.c
index f3e15d7e..f547d8f1 100644
--- a/account.c
+++ b/account.c
@@ -189,6 +189,7 @@ account_t *account_get( irc_t *irc, char *id )
void account_del( irc_t *irc, account_t *acc )
{
account_t *a, *l = NULL;
+ struct chat *c, *nc;
if( acc->ic )
/* Caller should have checked, accounts still in use can't be deleted. */
@@ -202,6 +203,13 @@ void account_del( irc_t *irc, account_t *acc )
else
irc->accounts = a->next;
+ for( c = irc->chatrooms; c; c = nc )
+ if( acc == c->acc )
+ {
+ nc = c->next;
+ chat_del( irc, c );
+ }
+
while( a->set )
set_del( &a->set, a->set->key );
diff --git a/chat.c b/chat.c
index 234c1a23..a4c1cce9 100644
--- a/chat.c
+++ b/chat.c
@@ -125,6 +125,31 @@ struct chat *chat_get( irc_t *irc, char *id )
return ret;
}
+int chat_del( irc_t *irc, struct chat *chat )
+{
+ struct chat *c, *l = NULL;
+
+ for( c = irc->chatrooms; c; c = (l=c)->next )
+ if( c == chat )
+ break;
+
+ if( c == NULL )
+ return 0;
+ else if( l == NULL )
+ irc->chatrooms = c->next;
+ else
+ l->next = c->next;
+
+ while( c->set )
+ set_del( &c->set, c->set->key );
+
+ g_free( c->handle );
+ g_free( c->channel );
+ g_free( c );
+
+ return 1;
+}
+
int chat_chancmp( char *a, char *b )
{
if( !chat_chanok( a ) || !chat_chanok( b ) )
diff --git a/chat.h b/chat.h
index 6793b646..8c07d3d0 100644
--- a/chat.h
+++ b/chat.h
@@ -38,6 +38,7 @@ struct chat *chat_add( irc_t *irc, account_t *acc, char *handle, char *channel )
struct chat *chat_byhandle( irc_t *irc, account_t *acc, char *handle );
struct chat *chat_bychannel( irc_t *irc, char *channel );
struct chat *chat_get( irc_t *irc, char *id );
+int chat_del( irc_t *irc, struct chat *chat );
int chat_chancmp( char *a, char *b );
int chat_chanok( char *a );
diff --git a/root_commands.c b/root_commands.c
index 97cadffe..5b709b0e 100644
--- a/root_commands.c
+++ b/root_commands.c
@@ -1050,6 +1050,23 @@ static void cmd_chat( irc_t *irc, char **cmd )
{
cmd_set_real( irc, cmd + 1, cmd_chat_set_findhead );
}
+ else if( g_strcasecmp( cmd[1], "del" ) == 0 )
+ {
+ if( !cmd[2] )
+ {
+ irc_usermsg( irc, "Not enough parameters given (need %d)", 2 );
+ return;
+ }
+
+ if( ( c = chat_get( irc, cmd[2] ) ) )
+ {
+ chat_del( irc, c );
+ }
+ else
+ {
+ irc_usermsg( irc, "Could not remove chat." );
+ }
+ }
else if( g_strcasecmp( cmd[1], "with" ) == 0 )
{
user_t *u;
round-color: #fff0f0 } /* Literal.String.Escape */ .highlight .sh { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Heredoc */ .highlight .si { color: #3333bb; background-color: #fff0f0 } /* Literal.String.Interpol */ .highlight .sx { color: #22bb22; background-color: #f0fff0 } /* Literal.String.Other */ .highlight .sr { color: #008800; background-color: #fff0ff } /* Literal.String.Regex */ .highlight .s1 { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Single */ .highlight .ss { color: #aa6600; background-color: #fff0f0 } /* Literal.String.Symbol */ .highlight .bp { color: #003388 } /* Name.Builtin.Pseudo */ .highlight .fm { color: #0066bb; font-weight: bold } /* Name.Function.Magic */ .highlight .vc { color: #336699 } /* Name.Variable.Class */ .highlight .vg { color: #dd7700 } /* Name.Variable.Global */ .highlight .vi { color: #3333bb } /* Name.Variable.Instance */ .highlight .vm { color: #336699 } /* Name.Variable.Magic */ .highlight .il { color: #0000DD; font-weight: bold } /* Literal.Number.Integer.Long */
#include <stdlib.h>
#include <glib.h>
#include <gmodule.h>
#include <check.h>
#include <string.h>
#include "set.h"
#include "testsuite.h"

START_TEST(test_set_add)
	void *data = "data";
	set_t *s = NULL, *t;
	t = set_add(&s, "name", "default", NULL, data);
	fail_unless(s == t);
	fail_unless(t->data == data);
	fail_unless(strcmp(t->def, "default") == 0);
END_TEST

START_TEST(test_set_add_existing)
	void *data = "data";
	set_t *s = NULL, *t;
	t = set_add(&s, "name", "default", NULL, data);
	t = set_add(&s, "name", "newdefault", NULL, data);
	fail_unless(s == t);
	fail_unless(strcmp(t->def, "newdefault") == 0);
END_TEST

START_TEST(test_set_find_unknown)
	set_t *s = NULL, *t;
	fail_unless (set_find(&s, "foo") == NULL);
END_TEST

START_TEST(test_set_find)
	void *data = "data";
	set_t *s = NULL, *t;
	t = set_add(&s, "name", "default", NULL, data);
	fail_unless(s == t);
	fail_unless(set_find(&s, "name") == t);
END_TEST

START_TEST(test_set_get_str_default)
	void *data = "data";
	set_t *s = NULL, *t;
	t = set_add(&s, "name", "default", NULL, data);
	fail_unless(s == t);
	fail_unless(strcmp(set_getstr(&s, "name"), "default") == 0);
END_TEST

START_TEST(test_set_get_bool_default)
	void *data = "data";
	set_t *s = NULL, *t;
	t = set_add(&s, "name", "true", NULL, data);
	fail_unless(s == t);
	fail_unless(set_getbool(&s, "name"));
END_TEST

START_TEST(test_set_get_bool_integer)
	void *data = "data";
	set_t *s = NULL, *t;
	t = set_add(&s, "name", "3", NULL, data);
	fail_unless(s == t);
	fail_unless(set_getbool(&s, "name") == 3);
END_TEST

START_TEST(test_set_get_bool_unknown)
	set_t *s = NULL;
	fail_unless(set_getbool(&s, "name") == 0);
END_TEST

START_TEST(test_set_get_str_value)
	void *data = "data";
	set_t *s = NULL, *t;
	t = set_add(&s, "name", "default", NULL, data);
	set_setstr(&s, "name", "foo");
	fail_unless(strcmp(set_getstr(&s, "name"), "foo") == 0);
END_TEST

START_TEST(test_set_get_str_unknown)
	set_t *s = NULL;
	fail_unless(set_getstr(&s, "name") == NULL);
END_TEST

START_TEST(test_setint)
	void *data = "data";
	set_t *s = NULL, *t;
	t = set_add(&s, "name", "10", NULL, data);
	set_setint(&s, "name", 3);
	fail_unless(set_getint(&s, "name") == 3);
END_TEST

START_TEST(test_setstr)
	void *data = "data";
	set_t *s = NULL, *t;
	t = set_add(&s, "name", "foo", NULL, data);
	set_setstr(&s, "name", "bloe");
	fail_unless(strcmp(set_getstr(&s, "name"), "bloe") == 0);
END_TEST

START_TEST(test_set_get_int_unknown)
	set_t *s = NULL;
	fail_unless(set_getint(&s, "foo") == 0);
END_TEST

Suite *set_suite (void)
{
	Suite *s = suite_create("Set");
	TCase *tc_core = tcase_create("Core");
	suite_add_tcase (s, tc_core);
	tcase_add_test (tc_core, test_set_add);
	tcase_add_test (tc_core, test_set_add_existing);
	tcase_add_test (tc_core, test_set_find_unknown);
	tcase_add_test (tc_core, test_set_find);
	tcase_add_test (tc_core, test_set_get_str_default);
	tcase_add_test (tc_core, test_set_get_str_value);
	tcase_add_test (tc_core, test_set_get_str_unknown);
	tcase_add_test (tc_core, test_set_get_bool_default);
	tcase_add_test (tc_core, test_set_get_bool_integer);
	tcase_add_test (tc_core, test_set_get_bool_unknown);
	tcase_add_test (tc_core, test_set_get_int_unknown);
	tcase_add_test (tc_core, test_setint);
	tcase_add_test (tc_core, test_setstr);
	return s;
}