1
0
mirror of https://github.com/Tha14/toxic.git synced 2025-07-01 10:56:44 +02:00

Implement new groupchats

This commit is contained in:
jfreegman
2020-11-12 21:30:48 -05:00
parent cec96e1ea3
commit 812210d63f
33 changed files with 3273 additions and 23 deletions

View File

@ -30,6 +30,7 @@
#include "conference.h"
#include "file_transfers.h"
#include "friendlist.h"
#include "groupchats.h"
#include "line_info.h"
#include "misc_tools.h"
#include "prompt.h"
@ -379,6 +380,168 @@ void on_lossless_custom_packet(Tox *m, uint32_t friendnumber, const uint8_t *dat
}
}
void on_group_invite(Tox *m, uint32_t friendnumber, const uint8_t *invite_data, size_t length,
const uint8_t *group_name,
size_t group_name_length, void *userdata)
{
char gname[MAX_STR_SIZE + 1];
group_name_length = copy_tox_str(gname, sizeof(gname), (const char *) group_name, group_name_length);
for (size_t i = 0; i < MAX_WINDOWS_NUM; ++i) {
if (windows[i] != NULL && windows[i]->onGroupInvite != NULL) {
windows[i]->onGroupInvite(windows[i], m, friendnumber, (char *) invite_data, length, gname, group_name_length);
}
}
}
void on_group_message(Tox *m, uint32_t groupnumber, uint32_t peer_id, TOX_MESSAGE_TYPE type,
const uint8_t *message, size_t length, void *userdata)
{
char msg[MAX_STR_SIZE + 1];
length = copy_tox_str(msg, sizeof(msg), (const char *) message, length);
for (size_t i = 0; i < MAX_WINDOWS_NUM; ++i) {
if (windows[i] != NULL && windows[i]->onGroupMessage != NULL) {
windows[i]->onGroupMessage(windows[i], m, groupnumber, peer_id, type, msg, length);
}
}
}
void on_group_private_message(Tox *m, uint32_t groupnumber, uint32_t peer_id, TOX_MESSAGE_TYPE type,
const uint8_t *message,
size_t length, void *userdata)
{
char msg[MAX_STR_SIZE + 1];
length = copy_tox_str(msg, sizeof(msg), (const char *) message, length);
for (size_t i = 0; i < MAX_WINDOWS_NUM; ++i) {
if (windows[i] != NULL && windows[i]->onGroupPrivateMessage != NULL) {
windows[i]->onGroupPrivateMessage(windows[i], m, groupnumber, peer_id, msg, length);
}
}
}
void on_group_status_change(Tox *m, uint32_t groupnumber, uint32_t peer_id, TOX_USER_STATUS status, void *userdata)
{
for (size_t i = 0; i < MAX_WINDOWS_NUM; ++i) {
if (windows[i] != NULL && windows[i]->onGroupStatusChange != NULL) {
windows[i]->onGroupStatusChange(windows[i], m, groupnumber, peer_id, status);
}
}
}
void on_group_peer_join(Tox *m, uint32_t groupnumber, uint32_t peer_id, void *userdata)
{
for (size_t i = 0; i < MAX_WINDOWS_NUM; ++i) {
if (windows[i] != NULL && windows[i]->onGroupPeerJoin != NULL) {
windows[i]->onGroupPeerJoin(windows[i], m, groupnumber, peer_id);
}
}
}
void on_group_peer_exit(Tox *m, uint32_t groupnumber, uint32_t peer_id, Tox_Group_Exit_Type exit_type,
const uint8_t *nick,
size_t nick_len, const uint8_t *part_message, size_t length, void *userdata)
{
char toxic_nick[TOXIC_MAX_NAME_LENGTH + 1];
nick_len = copy_tox_str(toxic_nick, sizeof(toxic_nick), (const char *) nick, nick_len);
char buf[MAX_STR_SIZE + 1] = {0};
size_t buf_len = 0;
if (part_message) {
buf_len = copy_tox_str(buf, sizeof(buf), (const char *) part_message, length);
}
for (size_t i = 0; i < MAX_WINDOWS_NUM; ++i) {
if (windows[i] != NULL && windows[i]->onGroupPeerExit != NULL) {
windows[i]->onGroupPeerExit(windows[i], m, groupnumber, peer_id, exit_type, toxic_nick, nick_len, buf, buf_len);
}
}
}
void on_group_topic_change(Tox *m, uint32_t groupnumber, uint32_t peer_id, const uint8_t *topic, size_t length,
void *userdata)
{
char data[MAX_STR_SIZE + 1];
length = copy_tox_str(data, sizeof(data), (const char *) topic, length);
for (size_t i = 0; i < MAX_WINDOWS_NUM; ++i) {
if (windows[i] != NULL && windows[i]->onGroupTopicChange != NULL) {
windows[i]->onGroupTopicChange(windows[i], m, groupnumber, peer_id, data, length);
}
}
}
void on_group_peer_limit(Tox *m, uint32_t groupnumber, uint32_t peer_limit, void *userdata)
{
for (size_t i = 0; i < MAX_WINDOWS_NUM; ++i) {
if (windows[i] != NULL && windows[i]->onGroupPeerLimit != NULL) {
windows[i]->onGroupPeerLimit(windows[i], m, groupnumber, peer_limit);
}
}
}
void on_group_privacy_state(Tox *m, uint32_t groupnumber, TOX_GROUP_PRIVACY_STATE privacy_state, void *userdata)
{
for (size_t i = 0; i < MAX_WINDOWS_NUM; ++i) {
if (windows[i] != NULL && windows[i]->onGroupPrivacyState != NULL) {
windows[i]->onGroupPrivacyState(windows[i], m, groupnumber, privacy_state);
}
}
}
void on_group_password(Tox *m, uint32_t groupnumber, const uint8_t *password, size_t length, void *userdata)
{
for (size_t i = 0; i < MAX_WINDOWS_NUM; ++i) {
if (windows[i] != NULL && windows[i]->onGroupPassword != NULL) {
windows[i]->onGroupPassword(windows[i], m, groupnumber, (char *) password, length);
}
}
}
void on_group_nick_change(Tox *m, uint32_t groupnumber, uint32_t peer_id, const uint8_t *newname, size_t length,
void *userdata)
{
char name[TOXIC_MAX_NAME_LENGTH + 1];
length = copy_tox_str(name, sizeof(name), (const char *) newname, length);
filter_str(name, length);
for (size_t i = 0; i < MAX_WINDOWS_NUM; ++i) {
if (windows[i] != NULL && windows[i]->onGroupNickChange != NULL) {
windows[i]->onGroupNickChange(windows[i], m, groupnumber, peer_id, name, length);
}
}
}
void on_group_self_join(Tox *m, uint32_t groupnumber, void *userdata)
{
for (size_t i = 0; i < MAX_WINDOWS_NUM; ++i) {
if (windows[i] != NULL && windows[i]->onGroupSelfJoin != NULL) {
windows[i]->onGroupSelfJoin(windows[i], m, groupnumber);
}
}
}
void on_group_rejected(Tox *m, uint32_t groupnumber, TOX_GROUP_JOIN_FAIL type, void *userdata)
{
for (size_t i = 0; i < MAX_WINDOWS_NUM; ++i) {
if (windows[i] != NULL && windows[i]->onGroupRejected != NULL) {
windows[i]->onGroupRejected(windows[i], m, groupnumber, type);
}
}
}
void on_group_moderation(Tox *m, uint32_t groupnumber, uint32_t source_peer_id, uint32_t target_peer_id,
TOX_GROUP_MOD_EVENT type, void *userdata)
{
for (size_t i = 0; i < MAX_WINDOWS_NUM; ++i) {
if (windows[i] != NULL && windows[i]->onGroupModeration != NULL) {
windows[i]->onGroupModeration(windows[i], m, groupnumber, source_peer_id, target_peer_id, type);
}
}
}
/* CALLBACKS END */
int add_window(Tox *m, ToxWindow *w)
@ -976,6 +1139,12 @@ void kill_all_windows(Tox *m)
#endif // GAMES
case WINDOW_TYPE_GROUPCHAT: {
exit_groupchat(w, m, w->num, user_settings->group_part_message,
strlen(user_settings->group_part_message));
break;
}
default: {
break;
}