aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ssh/client.c17
-rw-r--r--ssh/tomsg_clientlib.c32
-rw-r--r--ssh/tomsg_clientlib.h13
3 files changed, 61 insertions, 1 deletions
diff --git a/ssh/client.c b/ssh/client.c
index e6376cd..b293a33 100644
--- a/ssh/client.c
+++ b/ssh/client.c
@@ -244,6 +244,12 @@ static bool handle_line(
} else if (sv_equals(command, "create_room")) {
ret = tomsg_create_room(client);
+ } else if (sv_equals(command, "leave") || sv_equals(command, "leave_room")) {
+ if (parse_args(line, args, num_args = 1, false)) {
+ autocomplete_roomname(state, &args[0]);
+ ret = tomsg_leave_room(client, args[0]);
+ }
+
} else if (sv_equals(command, "invite")) {
if (parse_args(line, args, num_args = 2, false)) {
autocomplete_roomname(state, &args[0]);
@@ -368,6 +374,7 @@ static const char* event_type_descr(enum tomsg_event_type type) {
case TOMSG_EV_LIST_ROOMS: return "list_rooms";
case TOMSG_EV_LIST_MEMBERS: return "list_members";
case TOMSG_EV_CREATE_ROOM: return "create_room";
+ case TOMSG_EV_LEAVE_ROOM: return "leave_room";
case TOMSG_EV_INVITE: return "invite";
case TOMSG_EV_SEND: return "send";
case TOMSG_EV_HISTORY: return "history";
@@ -379,6 +386,7 @@ static const char* event_type_descr(enum tomsg_event_type type) {
case TOMSG_EV_PUSH_MESSAGE: return "push_message";
case TOMSG_EV_PUSH_INVITE: return "push_invite";
case TOMSG_EV_PUSH_JOIN: return "push_join";
+ case TOMSG_EV_PUSH_LEAVE: return "push_leave";
}
return "?unknown type?";
@@ -445,6 +453,10 @@ static void handle_event(struct state *state, const struct tomsg_event event) {
printf(" Created room %s\n", event.create_room.room_name);
break;
+ case TOMSG_EV_LEAVE_ROOM:
+ printf(" Left room %s\n", event.leave_room.room_name);
+ break;
+
case TOMSG_EV_INVITE:
printf(" Invited %s to %s\n",
event.join.username, event.join.room_name);
@@ -504,6 +516,11 @@ static void handle_event(struct state *state, const struct tomsg_event event) {
printf(" %s has joined %s\n",
event.join.username, event.join.room_name);
break;
+
+ case TOMSG_EV_PUSH_LEAVE:
+ printf(" %s has left room %s\n",
+ event.push_leave.username, event.push_leave.room_name);
+ break;
}
}
diff --git a/ssh/tomsg_clientlib.c b/ssh/tomsg_clientlib.c
index e6d3684..df22a1e 100644
--- a/ssh/tomsg_clientlib.c
+++ b/ssh/tomsg_clientlib.c
@@ -178,7 +178,7 @@ const char* tomsg_strerror(enum tomsg_retval code) {
static enum tomsg_retval version_negotiation(struct tomsg_client *client) {
if (!client->conn) return TOMSG_ERR_CLOSED;
- const enum sshnc_retval retssh = sshnc_send(client->conn, "ver version 2\n", 14);
+ const enum sshnc_retval retssh = sshnc_send(client->conn, "ver version 3\n", 14);
if (retssh == SSHNC_EOF) return TOMSG_ERR_CLOSED;
if (retssh != SSHNC_OK) return TOMSG_ERR_TRANSPORT;
@@ -607,6 +607,10 @@ void tomsg_event_nullify(struct tomsg_event event) {
free(event.create_room.room_name);
break;
+ case TOMSG_EV_LEAVE_ROOM:
+ free(event.leave_room.room_name);
+ break;
+
case TOMSG_EV_LIST_ROOMS:
if (event.list_rooms.rooms != NULL) {
for (int64_t i = 0; i < event.list_rooms.count; i++) {
@@ -649,6 +653,11 @@ void tomsg_event_nullify(struct tomsg_event event) {
free(event.push_invite.room_name);
free(event.push_invite.inviter);
break;
+
+ case TOMSG_EV_PUSH_LEAVE:
+ free(event.push_leave.room_name);
+ free(event.push_leave.username);
+ break;
}
}
@@ -717,6 +726,12 @@ static enum tomsg_retval handle_line(
PARSE_WORD(join.username);
EXPECT_FINISH();
return TOMSG_OK;
+ } else if (sv_equals(command, "leave")) {
+ eventp->type = TOMSG_EV_PUSH_LEAVE;
+ PARSE_WORD(push_leave.room_name);
+ PARSE_WORD(push_leave.username);
+ EXPECT_FINISH();
+ return TOMSG_OK;
} else {
// Unknown command, let's just ignore
return TOMSG_ERR_AGAIN;
@@ -757,6 +772,7 @@ static enum tomsg_retval handle_line(
case TOMSG_EV_LOGIN:
case TOMSG_EV_LOGOUT:
case TOMSG_EV_INVITE:
+ case TOMSG_EV_LEAVE_ROOM:
if (!sv_equals(command, "ok")) CLEANUP_RETURN(TOMSG_ERR_PARSE);
SUCCESS_RETURN();
@@ -883,6 +899,7 @@ static enum tomsg_retval handle_line(
case TOMSG_EV_PUSH_MESSAGE:
case TOMSG_EV_PUSH_INVITE:
case TOMSG_EV_PUSH_JOIN:
+ case TOMSG_EV_PUSH_LEAVE:
// What? Why did we put a push event in the inflight list? That's a bug.
assert(false);
}
@@ -1023,6 +1040,19 @@ enum tomsg_retval tomsg_create_room(struct tomsg_client *client) {
return add_inflight(client, tag, event);
}
+enum tomsg_retval tomsg_leave_room(
+ struct tomsg_client *client, const char *room_name) {
+ if (!client->conn) return TOMSG_ERR_CLOSED;
+ if (hasspacelf(room_name)) return TOMSG_ERR_SPACE;
+ const int64_t tag = client->next_tag++;
+ SEND_FMT(client, tag, "leave_room %s", room_name);
+ const struct tomsg_event event = (struct tomsg_event){
+ .type = TOMSG_EV_LEAVE_ROOM,
+ .leave_room.room_name = strdup(room_name),
+ };
+ return add_inflight(client, tag, event);
+}
+
enum tomsg_retval tomsg_invite(
struct tomsg_client *client, const char *room_name, const char *username) {
if (!client->conn) return TOMSG_ERR_CLOSED;
diff --git a/ssh/tomsg_clientlib.h b/ssh/tomsg_clientlib.h
index 8a4aae4..20eb96e 100644
--- a/ssh/tomsg_clientlib.h
+++ b/ssh/tomsg_clientlib.h
@@ -123,6 +123,7 @@ enum tomsg_event_type {
TOMSG_EV_LIST_ROOMS, // list_rooms
TOMSG_EV_LIST_MEMBERS, // list_members
TOMSG_EV_CREATE_ROOM, // create_room
+ TOMSG_EV_LEAVE_ROOM, // leave_room
TOMSG_EV_INVITE, // join
TOMSG_EV_SEND, // send
TOMSG_EV_HISTORY, // history
@@ -134,6 +135,7 @@ enum tomsg_event_type {
TOMSG_EV_PUSH_MESSAGE, // push_message
TOMSG_EV_PUSH_INVITE, // push_invite
TOMSG_EV_PUSH_JOIN, // join
+ TOMSG_EV_PUSH_LEAVE, // push_leave
};
struct history_message {
@@ -170,6 +172,9 @@ struct tomsg_event {
} create_room;
struct {
char *room_name;
+ } leave_room;
+ struct {
+ char *room_name;
char *username;
} join;
struct {
@@ -200,6 +205,10 @@ struct tomsg_event {
char *room_name;
char *inviter;
} push_invite;
+ struct {
+ char *room_name;
+ char *username;
+ } push_leave;
};
};
@@ -243,6 +252,10 @@ enum tomsg_retval tomsg_list_members(struct tomsg_client *client, const char *ro
// Send a create_room command to the server.
enum tomsg_retval tomsg_create_room(struct tomsg_client *client);
+// Send a leave_room command to the server.
+enum tomsg_retval tomsg_leave_room(
+ struct tomsg_client *client, const char *room_name);
+
// Send an invite command to the server.
enum tomsg_retval tomsg_invite(
struct tomsg_client *client, const char *room_name, const char *username);