179 lines
6.0 KiB
Objective-C
179 lines
6.0 KiB
Objective-C
//
|
|
// TLExpressionHelper.m
|
|
// TLChat
|
|
//
|
|
// Created by 李伯坤 on 16/3/11.
|
|
// Copyright © 2016年 李伯坤. All rights reserved.
|
|
//
|
|
|
|
#import "TLExpressionHelper.h"
|
|
#import "TLDBExpressionStore.h"
|
|
#import "TLEmojiKBHelper.h"
|
|
#import "TLUserHelper.h"
|
|
#import "NSFileManager+TLChat.h"
|
|
|
|
@interface TLExpressionHelper ()
|
|
|
|
@property (nonatomic, strong) TLDBExpressionStore *store;
|
|
|
|
@end
|
|
|
|
@implementation TLExpressionHelper
|
|
@synthesize defaultFaceGroup = _defaultFaceGroup;
|
|
@synthesize defaultSystemEmojiGroup = _defaultSystemEmojiGroup;
|
|
@synthesize userEmojiGroups = _userEmojiGroups;
|
|
|
|
+ (TLExpressionHelper *)sharedHelper
|
|
{
|
|
static TLExpressionHelper *helper;
|
|
static dispatch_once_t onceToken;
|
|
dispatch_once(&onceToken, ^{
|
|
helper = [[TLExpressionHelper alloc] init];
|
|
});
|
|
return helper;
|
|
}
|
|
|
|
- (NSArray *)userEmojiGroups
|
|
{
|
|
return [self.store expressionGroupsByUid:[TLUserHelper sharedHelper].userID];
|
|
}
|
|
|
|
- (BOOL)addExpressionGroup:(TLExpressionGroupModel *)emojiGroup
|
|
{
|
|
BOOL ok = [self.store addExpressionGroup:emojiGroup forUid:[TLUserHelper sharedHelper].userID];
|
|
if (ok) { // 通知表情键盘
|
|
[[TLEmojiKBHelper sharedKBHelper] updateEmojiGroupData];
|
|
}
|
|
return ok;
|
|
}
|
|
|
|
- (BOOL)deleteExpressionGroupByID:(NSString *)groupID
|
|
{
|
|
TLExpressionGroupModel *groupModel = [self emojiGroupByID:groupID];
|
|
BOOL ok = [self.store deleteExpressionGroupByID:groupID forUid:[TLUserHelper sharedHelper].userID];
|
|
if (ok) { // 通知表情键盘
|
|
[[TLEmojiKBHelper sharedKBHelper] updateEmojiGroupData];
|
|
|
|
BOOL canDeleteFile = ![self didExpressionGroupAlwaysInUsed:groupID];
|
|
if (canDeleteFile) {
|
|
NSError *error;
|
|
ok = [[NSFileManager defaultManager] removeItemAtPath:groupModel.path error:&error];
|
|
if (!ok) {
|
|
DDLogError(@"删除表情文件失败\n路径:%@\n原因:%@", groupModel.path, [error description]);
|
|
}
|
|
}
|
|
}
|
|
return ok;
|
|
}
|
|
|
|
- (BOOL)didExpressionGroupAlwaysInUsed:(NSString *)groupID
|
|
{
|
|
NSInteger count = [self.store countOfUserWhoHasExpressionGroup:groupID];
|
|
return count > 0;
|
|
}
|
|
|
|
- (TLExpressionGroupModel *)emojiGroupByID:(NSString *)groupID;
|
|
{
|
|
for (TLExpressionGroupModel *group in self.userEmojiGroups) {
|
|
if ([group.gId isEqualToString:groupID]) {
|
|
return group;
|
|
}
|
|
}
|
|
return nil;
|
|
}
|
|
|
|
- (void)downloadExpressionsWithGroupInfo:(TLExpressionGroupModel *)group
|
|
progress:(void (^)(CGFloat))progress
|
|
success:(void (^)(TLExpressionGroupModel *))success
|
|
failure:(void (^)(TLExpressionGroupModel *, NSString *))failure
|
|
{
|
|
group.type = TLEmojiTypeImageWithTitle;
|
|
dispatch_queue_t downloadQueue = dispatch_queue_create([group.gId UTF8String], nil);
|
|
dispatch_group_t downloadGroup = dispatch_group_create();
|
|
|
|
__block CGFloat p = 0;
|
|
for (int i = 0; i <= group.data.count; i++) {
|
|
dispatch_group_async(downloadGroup, downloadQueue, ^{
|
|
NSString *groupPath = [NSFileManager pathExpressionForGroupID:group.gId];
|
|
NSString *emojiPath;
|
|
NSData *data = nil;
|
|
if (i == group.data.count) {
|
|
emojiPath = [NSString stringWithFormat:@"%@icon_%@", groupPath, group.gId];
|
|
data = [NSData dataWithContentsOfURL:TLURL(group.iconURL)];
|
|
}
|
|
else {
|
|
TLExpressionModel *emoji = group.data[i];
|
|
NSString *urlString = [TLExpressionModel expressionDownloadURLWithEid:emoji.eId];
|
|
data = [NSData dataWithContentsOfURL:TLURL(urlString)];
|
|
if (data == nil) {
|
|
urlString = [TLExpressionModel expressionURLWithEid:emoji.eId];
|
|
data = [NSData dataWithContentsOfURL:TLURL(urlString)];
|
|
}
|
|
emojiPath = [NSString stringWithFormat:@"%@%@", groupPath, emoji.eId];
|
|
}
|
|
|
|
[data writeToFile:emojiPath atomically:YES];
|
|
p += 1.0;
|
|
dispatch_async(dispatch_get_main_queue(), ^{
|
|
if (progress) {
|
|
progress(p / group.data.count);
|
|
}
|
|
});
|
|
});
|
|
}
|
|
dispatch_group_notify(downloadGroup, dispatch_get_main_queue(), ^{
|
|
success(group);
|
|
});
|
|
}
|
|
|
|
- (void)updateExpressionGroupModelsStatus:(NSArray *)groupModelArray
|
|
{
|
|
for (TLExpressionGroupModel *group in groupModelArray) {
|
|
TLExpressionGroupModel *localEmojiGroup = [[TLExpressionHelper sharedHelper] emojiGroupByID:group.gId];
|
|
if (localEmojiGroup) {
|
|
group.status = TLExpressionGroupStatusLocal;
|
|
}
|
|
}
|
|
}
|
|
|
|
#pragma mark - # Getter
|
|
- (TLDBExpressionStore *)store
|
|
{
|
|
if (_store == nil) {
|
|
_store = [[TLDBExpressionStore alloc] init];
|
|
}
|
|
return _store;
|
|
}
|
|
|
|
- (TLExpressionGroupModel *)defaultFaceGroup
|
|
{
|
|
if (_defaultFaceGroup == nil) {
|
|
_defaultFaceGroup = [[TLExpressionGroupModel alloc] init];
|
|
_defaultFaceGroup.type = TLEmojiTypeFace;
|
|
_defaultFaceGroup.iconPath = @"emojiKB_group_face";
|
|
NSString *path = [[NSBundle mainBundle] pathForResource:@"FaceEmoji" ofType:@"json"];
|
|
NSData *data = [NSData dataWithContentsOfFile:path];
|
|
_defaultFaceGroup.data = [TLExpressionModel mj_objectArrayWithKeyValuesArray:data];
|
|
for (TLExpressionModel *emoji in _defaultFaceGroup.data) {
|
|
emoji.type = TLEmojiTypeFace;
|
|
}
|
|
}
|
|
return _defaultFaceGroup;
|
|
}
|
|
|
|
- (TLExpressionGroupModel *)defaultSystemEmojiGroup
|
|
{
|
|
if (_defaultSystemEmojiGroup == nil) {
|
|
_defaultSystemEmojiGroup = [[TLExpressionGroupModel alloc] init];
|
|
_defaultSystemEmojiGroup.type = TLEmojiTypeEmoji;
|
|
_defaultSystemEmojiGroup.iconPath = @"emojiKB_group_face";
|
|
NSString *path = [[NSBundle mainBundle] pathForResource:@"SystemEmoji" ofType:@"json"];
|
|
NSData *data = [NSData dataWithContentsOfFile:path];
|
|
_defaultSystemEmojiGroup.data = [TLExpressionModel mj_objectArrayWithKeyValuesArray:data];
|
|
}
|
|
return _defaultSystemEmojiGroup;
|
|
}
|
|
|
|
@end
|
|
|