telegram-purple/telegram-adium/TelegramJoinChatViewController.m

114 lines
4.1 KiB
Objective-C

/**
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1301 USA
*
* Copyright Matthias Jentsch 2014-2015
*/
#include "telegram-purple.h"
#include "TelegramJoinChatViewController.h"
#include "TelegramAutocompletionDelegate.h"
#import <Adium/AIContactControllerProtocol.h>
#import <Adium/AIListContact.h>
#import <AdiumLibpurple/CBPurpleAccount.h>
@interface NSObject (JointChatViewDelegate)
- (void)setJoinChatEnabled:(BOOL)enabled;
@end
@implementation TelegramJoinChatViewController
static void tgl_chat_iterator_cb (tgl_peer_t *peer, void *extra) {
NSMutableArray *A = (__bridge NSMutableArray *)(extra);
// chats with 0 participants were deleted or left by the user
if (tgl_get_peer_type (peer->id) == TGL_PEER_CHAT && peer->chat.users_num > 0) {
[A addObject: [NSString stringWithUTF8String: peer->print_name]];
}
}
- (void)configureForAccount:(AIAccount *)inAccount
{
[super configureForAccount:inAccount];
PurpleAccount *pa = [(CBPurpleAccount *)inAccount purpleAccount];
PurpleConnection *gc = purple_account_get_connection(pa);
if (gc && PURPLE_CONNECTION_IS_CONNECTED(gc)) {
connection_data *conn = purple_connection_get_protocol_data (gc);
// fetch all active chats and put them into the select box
[popupButton_existingChat removeAllItems];
NSMutableArray *chats = [NSMutableArray new];
tgl_peer_iterator_ex (conn->TLS, tgl_chat_iterator_cb, (__bridge void *)(chats));
[popupButton_existingChat
addItemsWithTitles: [chats sortedArrayUsingSelector:@selector(localizedCaseInsensitiveCompare:)]];
// provide the current TLS instance for access by the autocompletion
TelegramAutocompletionDelegate *D = [tokenField_createChatUsers delegate];
if (D != nil) {
[D setTLS:conn->TLS];
}
}
}
- (void)joinChatWithAccount:(AIAccount *)inAccount
{
PurpleAccount *pa = [(CBPurpleAccount *)inAccount purpleAccount];
PurpleConnection *gc = purple_account_get_connection(pa);
if (gc && PURPLE_CONNECTION_IS_CONNECTED(gc)) {
connection_data *conn = purple_connection_get_protocol_data (gc);
// Join by link
NSString *link = [textField_joinByLink stringValue];
if ([link length]) {
import_chat_link_checked (conn->TLS, [link UTF8String]);
return;
}
// Create a new chat with provided participants
NSString *createChatName = [textField_createChatName stringValue];
NSArray *tokens = [tokenField_createChatUsers objectValue];
if ([createChatName length] && [tokens count]) {
int i, cnt = (int)[tokens count];
const char **users = g_malloc(cnt * sizeof(char*));
for (i = 0; i < cnt; i++) {
users[i] = [tokens[i] UTF8String];
}
tgp_create_group_chat_by_usernames (conn->TLS, [createChatName UTF8String], users, i, TRUE);
g_free (users);
return;
}
// Pass the joining to the prpl
const char *name = [[[popupButton_existingChat selectedItem] title] UTF8String];
PurpleChat *purpleChat = purple_blist_find_chat (conn->pa, name);
if (purpleChat) {
serv_join_chat (conn->gc, purple_chat_get_components (purpleChat));
} else {
GHashTable *chatCreationInfo = g_hash_table_new_full (g_str_hash, g_str_equal, NULL, g_free);
g_hash_table_insert (chatCreationInfo, "subject", g_strdup (name));
serv_join_chat (conn->gc, chatCreationInfo);
g_hash_table_destroy (chatCreationInfo);
}
}
}
- (NSString *)nibName
{
return @"TelegramJoinChatView";
}
@end