diff --git a/src/twc-chat.c b/src/twc-chat.c
index 203242e..ee2752e 100644
--- a/src/twc-chat.c
+++ b/src/twc-chat.c
@@ -17,6 +17,9 @@
* along with Tox-WeeChat. If not, see .
*/
+#include
+#include
+
#include
#include
@@ -40,29 +43,22 @@ int
twc_chat_buffer_close_callback(void *data,
struct t_gui_buffer *weechat_buffer);
-
/**
- * Create a new friend chat.
+ * Create a new chat.
*/
struct t_twc_chat *
-twc_chat_new_friend(struct t_twc_profile *profile,
- int32_t friend_number)
+twc_chat_create(struct t_twc_profile *profile,
+ const char *name)
{
struct t_twc_chat *chat = malloc(sizeof(struct t_twc_chat));
if (!chat)
return NULL;
- chat->friend_number = friend_number;
chat->profile = profile;
-
- uint8_t client_id[TOX_CLIENT_ID_SIZE];
- tox_get_client_id(profile->tox, friend_number, client_id);
+ chat->friend_number = chat->group_number = -1;
// TODO: prepend profile name
- char buffer_name[TOX_CLIENT_ID_SIZE * 2 + 1];
- twc_bin2hex(client_id, TOX_CLIENT_ID_SIZE, buffer_name);
-
- chat->buffer = weechat_buffer_new(buffer_name,
+ chat->buffer = weechat_buffer_new(name,
twc_chat_buffer_input_callback, chat,
twc_chat_buffer_close_callback, chat);
@@ -78,22 +74,70 @@ twc_chat_new_friend(struct t_twc_profile *profile,
return chat;
}
+/**
+ * Create a new friend chat.
+ */
+struct t_twc_chat *
+twc_chat_new_friend(struct t_twc_profile *profile,
+ int32_t friend_number)
+{
+ uint8_t client_id[TOX_CLIENT_ID_SIZE];
+ tox_get_client_id(profile->tox, friend_number, client_id);
+
+ char buffer_name[TOX_CLIENT_ID_SIZE * 2 + 1];
+ twc_bin2hex(client_id, TOX_CLIENT_ID_SIZE, buffer_name);
+
+ struct t_twc_chat *chat = twc_chat_create(profile, buffer_name);
+ if (chat)
+ chat->friend_number = friend_number;
+
+ return chat;
+}
+
+/**
+ * Create a new friend chat.
+ */
+struct t_twc_chat *
+twc_chat_new_group(struct t_twc_profile *profile,
+ int32_t group_number)
+{
+ char buffer_name[32];
+ sprintf(buffer_name, "group_chat_%d", group_number);
+
+ struct t_twc_chat *chat = twc_chat_create(profile, buffer_name);
+ if (chat)
+ chat->group_number = group_number;
+
+ return chat;
+}
+
/**
* Refresh a chat. Updates buffer short_name and title.
*/
void
twc_chat_refresh(struct t_twc_chat *chat)
{
- char *name = twc_get_name_nt(chat->profile->tox,
- chat->friend_number);
- char *status_message = twc_get_status_message_nt(chat->profile->tox,
- chat->friend_number);
+ char *name = NULL;
+ char *title = NULL;
+ if (chat->friend_number >= 0)
+ {
+ name = twc_get_name_nt(chat->profile->tox,
+ chat->friend_number);
+ title = twc_get_status_message_nt(chat->profile->tox,
+ chat->friend_number);
+ }
+ else if (chat->group_number >= 0)
+ {
+ name = malloc(sizeof(char) * 32);
+ sprintf(name, "Group Chat %d", chat->group_number);
+ title = strdup(name);
+ }
weechat_buffer_set(chat->buffer, "short_name", name);
- weechat_buffer_set(chat->buffer, "title", status_message);
+ weechat_buffer_set(chat->buffer, "title", title);
free(name);
- free(status_message);
+ free(title);
}
/**
@@ -136,10 +180,31 @@ twc_chat_search_friend(struct t_twc_profile *profile,
}
if (create_new)
- {
return twc_chat_new_friend(profile, friend_number);
+
+ return NULL;
+}
+
+/**
+ * Find an existing chat object for a friend, and if not found, optionally
+ * create a new one.
+ */
+struct t_twc_chat *
+twc_chat_search_group(struct t_twc_profile *profile,
+ int32_t group_number,
+ bool create_new)
+{
+ size_t index;
+ struct t_twc_list_item *item;
+ twc_list_foreach(profile->chats, index, item)
+ {
+ if (item->chat->group_number == group_number)
+ return item->chat;
}
+ if (create_new)
+ return twc_chat_new_friend(profile, group_number);
+
return NULL;
}
@@ -200,6 +265,7 @@ twc_chat_send_message(struct t_twc_chat *chat,
const char *message,
enum TWC_MESSAGE_TYPE message_type)
{
+ // TODO: fix for group messages
twc_message_queue_add_friend_message(chat->profile,
chat->friend_number,
message, message_type);
@@ -233,7 +299,6 @@ twc_chat_buffer_close_callback(void *data,
struct t_twc_chat *chat = data;
twc_list_remove_with_data(chat->profile->chats, chat);
-
free(chat);
return WEECHAT_RC_OK;
diff --git a/src/twc-chat.h b/src/twc-chat.h
index d87247b..f64fe4b 100644
--- a/src/twc-chat.h
+++ b/src/twc-chat.h
@@ -39,7 +39,7 @@ struct t_twc_chat
struct t_gui_buffer *buffer;
int32_t friend_number;
-
+ int32_t group_number;
};
struct t_twc_chat *
@@ -47,6 +47,11 @@ twc_chat_search_friend(struct t_twc_profile *profile,
int32_t friend_number,
bool create_new);
+struct t_twc_chat *
+twc_chat_search_group(struct t_twc_profile *profile,
+ int32_t group_number,
+ bool create_new);
+
struct t_twc_chat *
twc_chat_search_buffer(struct t_gui_buffer *target_buffer);