1
0
mirror of https://github.com/danog/Telegram.git synced 2024-12-04 10:27:46 +01:00
Telegram/Watch/Extension/TGBotCommandController.m

149 lines
4.1 KiB
Mathematica
Raw Normal View History

2015-10-01 18:19:52 +02:00
#import "TGBotCommandController.h"
#import <SSignalKit/SSignalKit.h>
#import "TGBridgeUser.h"
#import "TGBridgeBotCommandInfo.h"
#import "WKInterfaceTable+TGDataDrivenTable.h"
#import "TGUserRowController.h"
NSString *const TGBotCommandControllerIdentifier = @"TGBotCommandController";
NSString *const TGBotCommandKey = @"command";
NSString *const TGBotCommandUserKey = @"user";
NSString *const TGBotCommandListKey = @"list";
@implementation TGBotCommandControllerContext
@end
@interface TGBotCommandController () <TGTableDataSource>
{
SMetaDisposable *_commandDisposable;
NSArray *_commandList;
TGBotCommandControllerContext *_context;
}
@end
@implementation TGBotCommandController
- (instancetype)init
{
self = [super init];
if (self != nil)
{
_commandDisposable = [[SMetaDisposable alloc] init];
[self.table _setInitialHidden:true];
self.table.tableDataSource = self;
}
return self;
}
- (void)dealloc
{
[_commandDisposable dispose];
}
- (void)configureWithContext:(TGBotCommandControllerContext *)context
{
_context = context;
__weak TGBotCommandController *weakSelf = self;
[_commandDisposable setDisposable:[[context.commandListSignal deliverOn:[SQueue mainQueue]] startWithNext:^(NSArray *next)
{
__strong TGBotCommandController *strongSelf = weakSelf;
if (strongSelf == nil)
return;
strongSelf->_commandList = next;
[strongSelf performInterfaceUpdate:^(bool animated)
{
__strong TGBotCommandController *strongSelf = weakSelf;
if (strongSelf == nil)
return;
strongSelf.activityIndicator.hidden = true;
[strongSelf.table reloadData];
strongSelf.table.hidden = false;
}];
}]];
}
#pragma mark -
- (Class)table:(WKInterfaceTable *)table rowControllerClassAtIndexPath:(TGIndexPath *)indexPath
{
return [TGUserRowController class];
}
- (NSUInteger)numberOfRowsInTable:(WKInterfaceTable *)table section:(NSUInteger)section
{
return [self numberOfAvailableCommands];
}
- (void)table:(WKInterfaceTable *)table updateRowController:(TGUserRowController *)controller forIndexPath:(TGIndexPath *)indexPath
{
NSDictionary *dict = [self dictionaryForRow:indexPath.row];
TGBridgeBotCommandInfo *commandInfo = dict[TGBotCommandKey];
TGBridgeUser *botUser = dict[TGBotCommandUserKey];
[controller updateWithBotCommandInfo:commandInfo botUser:botUser context:_context.context];
}
- (void)table:(WKInterfaceTable *)table didSelectRowAtIndexPath:(TGIndexPath *)indexPath
{
[self dismissController];
NSDictionary *dict = [self dictionaryForRow:indexPath.row];
TGBridgeBotCommandInfo *commandInfo = dict[TGBotCommandKey];
TGBridgeUser *botUser = dict[TGBotCommandUserKey];
bool isSingleBot = (_commandList.count == 1);
NSString *mention = isSingleBot ? @"" : [NSString stringWithFormat:@"@%@", botUser.userName];
NSString *command = [NSString stringWithFormat:@"/%@%@", commandInfo.command, mention];
if (_context.completionBlock != nil)
_context.completionBlock(command);
}
- (NSDictionary *)dictionaryForRow:(NSUInteger)row
{
NSRange currentRange = NSMakeRange(0, 0);
for (NSDictionary *dict in _commandList)
{
NSArray *commandList = dict[TGBotCommandListKey];
currentRange = NSMakeRange(currentRange.location + currentRange.length, commandList.count);
NSInteger transposedRow = row - currentRange.location;
if (transposedRow >= 0 && transposedRow < currentRange.length)
return @{ TGBotCommandUserKey: dict[TGBotCommandUserKey], TGBotCommandKey: commandList[transposedRow]};
}
return nil;
}
- (NSUInteger)numberOfAvailableCommands
{
NSUInteger count = 0;
for (NSDictionary *dict in _commandList)
{
id commandList = dict[TGBotCommandListKey];
if ([commandList isKindOfClass:[NSArray class]])
count += [commandList count];
}
return count;
}
#pragma mark -
+ (NSString *)identifier
{
return TGBotCommandControllerIdentifier;
}
@end