1
0
mirror of https://github.com/danog/Telegram.git synced 2024-12-02 09:27:55 +01:00
Telegram/Telegraph/TGApplicationFeatures.m
2015-10-01 19:19:52 +03:00

244 lines
9.3 KiB
Objective-C

#import "TGApplicationFeatures.h"
#import "TGApplicationFeatureDescription.h"
#import "TGDatabase.h"
static bool inBatchUpdate = false;
static NSMutableDictionary *cachedFeatures()
{
static NSMutableDictionary *dict = nil;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^
{
dict = [[NSMutableDictionary alloc] init];
NSData *storedData = [TGDatabaseInstance() customProperty:@"applicationFeatures"];
if (storedData != nil)
{
NSArray *featureList = [NSKeyedUnarchiver unarchiveObjectWithData:storedData];
for (TGApplicationFeatureDescription *feature in featureList)
{
dict[feature.identifier] = feature;
}
}
});
return dict;
}
static NSUInteger cachedLargeGroupLimit = 100;
@implementation TGApplicationFeatures
+ (bool)_isFeatureEnabledForIdentifier:(NSString *)identifier disabledMessage:(__autoreleasing NSString **)disabledMessage
{
TGApplicationFeatureDescription *feature = cachedFeatures()[identifier];
if (feature == nil)
return true;
if (!feature.enabled && disabledMessage)
*disabledMessage = feature.disabledMessage;
return feature.enabled;
}
+ (void)_setFeatureEnabledForIdentifier:(NSString *)identifier enabled:(bool)enabled disabledMessage:(NSString *)disabledMessage
{
cachedFeatures()[identifier] = [[TGApplicationFeatureDescription alloc] initWithIdentifier:identifier enabled:enabled disabledMessage:disabledMessage];
if (!inBatchUpdate)
[self _storeCachedFeatures];
}
+ (bool)isGroupLarge:(NSUInteger)memberCount
{
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^
{
NSData *data = [TGDatabaseInstance() customProperty:@"largeGroupMemberCountLimit"];
if (data != nil && data.length >= 4)
{
int32_t value = 0;
[data getBytes:&value length:4];
cachedLargeGroupLimit = (NSUInteger)value;
}
});
return memberCount >= cachedLargeGroupLimit;
}
+ (void)setLargeGroupMemberCountLimit:(NSUInteger)memberCount
{
cachedLargeGroupLimit = memberCount;
int32_t value = (int32_t)memberCount;
[TGDatabaseInstance() setCustomProperty:@"largeGroupMemberCountLimit" value:[NSData dataWithBytes:&value length:4]];
}
+ (void)batchUpdate:(dispatch_block_t)block
{
inBatchUpdate = true;
block();
inBatchUpdate = false;
[self _storeCachedFeatures];
}
+ (void)rawUpdate:(NSArray *)features
{
[cachedFeatures() removeAllObjects];
for (TGApplicationFeatureDescription *feature in features)
{
cachedFeatures()[feature.identifier] = feature;
}
[self _storeCachedFeatures];
}
+ (void)_storeCachedFeatures
{
NSData *storedData = [NSKeyedArchiver archivedDataWithRootObject:[cachedFeatures() allValues]];
[TGDatabaseInstance() setCustomProperty:@"applicationFeatures" value:storedData];
}
+ (bool)isPhotoUploadEnabledForPeerType:(TGApplicationFeaturePeerType)peerType disabledMessage:(__autoreleasing NSString **)disabledMessage
{
switch (peerType)
{
case TGApplicationFeaturePeerPrivate:
return [self _isFeatureEnabledForIdentifier:@"pm_upload_photo" disabledMessage:disabledMessage];
case TGApplicationFeaturePeerGroup:
return [self _isFeatureEnabledForIdentifier:@"chat_upload_photo" disabledMessage:disabledMessage];
case TGApplicationFeaturePeerLargeGroup:
return [self _isFeatureEnabledForIdentifier:@"bigchat_upload_photo" disabledMessage:disabledMessage];
}
}
+ (bool)isFileUploadEnabledForPeerType:(TGApplicationFeaturePeerType)peerType disabledMessage:(__autoreleasing NSString **)disabledMessage
{
switch (peerType)
{
case TGApplicationFeaturePeerPrivate:
return [self _isFeatureEnabledForIdentifier:@"pm_upload_document" disabledMessage:disabledMessage];
case TGApplicationFeaturePeerGroup:
return [self _isFeatureEnabledForIdentifier:@"chat_upload_document" disabledMessage:disabledMessage];
case TGApplicationFeaturePeerLargeGroup:
return [self _isFeatureEnabledForIdentifier:@"bigchat_upload_document" disabledMessage:disabledMessage];
}
}
+ (bool)isAudioUploadEnabledForPeerType:(TGApplicationFeaturePeerType)peerType disabledMessage:(__autoreleasing NSString **)disabledMessage
{
switch (peerType)
{
case TGApplicationFeaturePeerPrivate:
return [self _isFeatureEnabledForIdentifier:@"pm_upload_audio" disabledMessage:disabledMessage];
case TGApplicationFeaturePeerGroup:
return [self _isFeatureEnabledForIdentifier:@"chat_upload_audio" disabledMessage:disabledMessage];
case TGApplicationFeaturePeerLargeGroup:
return [self _isFeatureEnabledForIdentifier:@"bigchat_upload_audio" disabledMessage:disabledMessage];
}
}
+ (bool)isTextMessageEnabledForPeerType:(TGApplicationFeaturePeerType)peerType disabledMessage:(__autoreleasing NSString **)disabledMessage
{
switch (peerType)
{
case TGApplicationFeaturePeerPrivate:
return [self _isFeatureEnabledForIdentifier:@"pm_message" disabledMessage:disabledMessage];
case TGApplicationFeaturePeerGroup:
return [self _isFeatureEnabledForIdentifier:@"chat_message" disabledMessage:disabledMessage];
case TGApplicationFeaturePeerLargeGroup:
return [self _isFeatureEnabledForIdentifier:@"bigchat_message" disabledMessage:disabledMessage];
}
}
+ (bool)isGroupCreationEnabled:(__autoreleasing NSString **)disabledMessage
{
return [self _isFeatureEnabledForIdentifier:@"chat_create" disabledMessage:disabledMessage];
}
+ (bool)isBroadcastCreationEnabled:(__autoreleasing NSString **)disabledMessage
{
return [self _isFeatureEnabledForIdentifier:@"broadcast_create" disabledMessage:disabledMessage];
}
+ (void)setIsPhotoUploadEnabledForPeerType:(TGApplicationFeaturePeerType)peerType enabled:(bool)enabled disabledMessage:(NSString *)disabledMessage
{
switch (peerType)
{
case TGApplicationFeaturePeerPrivate:
[self _setFeatureEnabledForIdentifier:@"pm_upload_photo" enabled:enabled disabledMessage:disabledMessage];
break;
case TGApplicationFeaturePeerGroup:
[self _setFeatureEnabledForIdentifier:@"chat_upload_photo" enabled:enabled disabledMessage:disabledMessage];
break;
case TGApplicationFeaturePeerLargeGroup:
[self _setFeatureEnabledForIdentifier:@"bigchat_upload_photo" enabled:enabled disabledMessage:disabledMessage];
break;
default:
break;
}
}
+ (void)setIsFileUploadEnabledForPeerType:(TGApplicationFeaturePeerType)peerType enabled:(bool)enabled disabledMessage:(NSString *)disabledMessage
{
switch (peerType)
{
case TGApplicationFeaturePeerPrivate:
[self _setFeatureEnabledForIdentifier:@"pm_upload_document" enabled:enabled disabledMessage:disabledMessage];
break;
case TGApplicationFeaturePeerGroup:
[self _setFeatureEnabledForIdentifier:@"chat_upload_document" enabled:enabled disabledMessage:disabledMessage];
break;
case TGApplicationFeaturePeerLargeGroup:
[self _setFeatureEnabledForIdentifier:@"bigchat_upload_document" enabled:enabled disabledMessage:disabledMessage];
break;
default:
break;
}
}
+ (void)setIsAudioUploadEnabledForPeerType:(TGApplicationFeaturePeerType)peerType enabled:(bool)enabled disabledMessage:(NSString *)disabledMessage
{
switch (peerType)
{
case TGApplicationFeaturePeerPrivate:
[self _setFeatureEnabledForIdentifier:@"pm_upload_audio" enabled:enabled disabledMessage:disabledMessage];
break;
case TGApplicationFeaturePeerGroup:
[self _setFeatureEnabledForIdentifier:@"chat_upload_audio" enabled:enabled disabledMessage:disabledMessage];
break;
case TGApplicationFeaturePeerLargeGroup:
[self _setFeatureEnabledForIdentifier:@"bigchat_upload_audio" enabled:enabled disabledMessage:disabledMessage];
break;
default:
break;
}
}
+ (void)setIsTextMessageEnabledForPeerType:(TGApplicationFeaturePeerType)peerType enabled:(bool)enabled disabledMessage:(NSString *)disabledMessage
{
switch (peerType)
{
case TGApplicationFeaturePeerPrivate:
[self _setFeatureEnabledForIdentifier:@"pm_message" enabled:enabled disabledMessage:disabledMessage];
break;
case TGApplicationFeaturePeerGroup:
[self _setFeatureEnabledForIdentifier:@"chat_message" enabled:enabled disabledMessage:disabledMessage];
break;
case TGApplicationFeaturePeerLargeGroup:
[self _setFeatureEnabledForIdentifier:@"bigchat_message" enabled:enabled disabledMessage:disabledMessage];
break;
default:
break;
}
}
+ (void)setIsPhotoGroupCreationEnabled:(bool)enabled disabledMessage:(NSString *)disabledMessage
{
[self _setFeatureEnabledForIdentifier:@"chat_create" enabled:enabled disabledMessage:disabledMessage];
}
+ (void)setIsBroadcastCreationEnabled:(bool)enabled disabledMessage:(NSString *)disabledMessage
{
[self _setFeatureEnabledForIdentifier:@"broadcast_create" enabled:enabled disabledMessage:disabledMessage];
}
@end