mirror of
https://github.com/danog/Telegram.git
synced 2024-12-04 02:17:51 +01:00
149 lines
4.1 KiB
Objective-C
149 lines
4.1 KiB
Objective-C
#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 |