Browse Source

Improved inline bots

master
Igor Zhukov 9 years ago
parent
commit
70e39704e1
  1. 7
      app/js/controllers.js
  2. 3
      app/js/filters.js
  3. 11
      app/js/message_composer.js
  4. 61
      app/js/messages_manager.js
  5. 102
      app/js/services.js
  6. 10
      app/less/app.less

7
app/js/controllers.js

@ -2081,7 +2081,7 @@ angular.module('myApp.controllers', ['myApp.i18n'])
$scope.$on('user_update', angular.noop); $scope.$on('user_update', angular.noop);
}) })
.controller('AppImSendController', function ($scope, $timeout, MtpApiManager, Storage, AppProfileManager, AppChatsManager, AppUsersManager, AppPeersManager, AppDocsManager, AppMessagesManager, MtpApiFileManager, RichTextProcessor) { .controller('AppImSendController', function ($scope, $timeout, MtpApiManager, Storage, AppProfileManager, AppChatsManager, AppUsersManager, AppPeersManager, AppDocsManager, AppMessagesManager, AppInlineBotsManager, MtpApiFileManager, RichTextProcessor) {
$scope.$watch('curDialog.peer', resetDraft); $scope.$watch('curDialog.peer', resetDraft);
$scope.$on('user_update', angular.noop); $scope.$on('user_update', angular.noop);
@ -2421,7 +2421,7 @@ angular.module('myApp.controllers', ['myApp.i18n'])
prefix: '@' + username + matches[2], prefix: '@' + username + matches[2],
placeholder: inlineBot.placeholder placeholder: inlineBot.placeholder
}); });
AppMessagesManager.getInlineResults(inlineBot.id, matches[3], '').then(function (botResults) { AppInlineBotsManager.getInlineResults(inlineBot.id, matches[3], '').then(function (botResults) {
$scope.$broadcast('inline_results', botResults); $scope.$broadcast('inline_results', botResults);
delete $scope.draftMessage.inlineProgress; delete $scope.draftMessage.inlineProgress;
}, function () { }, function () {
@ -2523,7 +2523,8 @@ angular.module('myApp.controllers', ['myApp.i18n'])
var options = { var options = {
replyToMsgID: $scope.draftMessage.replyToMessage && $scope.draftMessage.replyToMessage.mid replyToMsgID: $scope.draftMessage.replyToMessage && $scope.draftMessage.replyToMessage.mid
}; };
AppMessagesManager.sendInlineResult($scope.curDialog.peerID, qID, options); AppInlineBotsManager.sendInlineResult($scope.curDialog.peerID, qID, options);
fwdsSend();
resetDraft(); resetDraft();
delete $scope.draftMessage.sticker; delete $scope.draftMessage.sticker;
delete $scope.draftMessage.text; delete $scope.draftMessage.text;

3
app/js/filters.js

@ -187,6 +187,9 @@ angular.module('myApp.filters', ['myApp.i18n'])
.filter('formatSizeProgress', function ($filter, _) { .filter('formatSizeProgress', function ($filter, _) {
var formatSizeFilter = $filter('formatSize'); var formatSizeFilter = $filter('formatSize');
return function (progress) { return function (progress) {
if (!progress.total) {
return '';
}
var done = formatSizeFilter(progress.done, true), var done = formatSizeFilter(progress.done, true),
doneParts = done.split(' '), doneParts = done.split(' '),
total = formatSizeFilter(progress.total), total = formatSizeFilter(progress.total),

11
app/js/message_composer.js

@ -727,13 +727,14 @@ MessageComposer.prototype.setInlinePlaceholder = function (prefix, placeholder)
this.inlinePlaceholderPrefix = prefix this.inlinePlaceholderPrefix = prefix
this.inlinePlaceholderPrefixEl.html(encodeEntities(prefix)); this.inlinePlaceholderPrefixEl.html(encodeEntities(prefix));
this.inlinePlaceholderEl.html(encodeEntities(placeholder)); this.inlinePlaceholderEl.html(encodeEntities(placeholder));
this.onChange();
} }
MessageComposer.prototype.updateInlinePlaceholder = function () { MessageComposer.prototype.updateInlinePlaceholder = function () {
var prefix = this.inlinePlaceholderPrefix; var prefix = this.inlinePlaceholderPrefix;
if (prefix) { if (prefix) {
var value = this.textareaEl.val(); var value = this.textareaEl.val();
this.inlinePlaceholderWrap.toggle(value == prefix); this.inlinePlaceholderWrap.toggleClass('active', value == prefix);
} }
} }
@ -868,7 +869,7 @@ MessageComposer.prototype.onKeyEvent = function (e) {
currentSel = $(this.autoCompleteEl).find('li:first'); currentSel = $(this.autoCompleteEl).find('li:first');
} }
currentSel = currentSel.find('a:first'); currentSel = currentSel.find('a:first');
var code, mention, command; var code, mention, command, inlineID;
if (code = currentSel.attr('data-code')) { if (code = currentSel.attr('data-code')) {
this.onEmojiSelected(code, true); this.onEmojiSelected(code, true);
EmojiHelper.pushPopularEmoji(code); EmojiHelper.pushPopularEmoji(code);
@ -884,7 +885,7 @@ MessageComposer.prototype.onKeyEvent = function (e) {
} }
return cancelEvent(e); return cancelEvent(e);
} }
if (inlineID = target.attr('data-inlineid')) { if (inlineID = currentSel.attr('data-inlineid')) {
if (self.onInlineResultSend) { if (self.onInlineResultSend) {
self.onInlineResultSend(inlineID); self.onInlineResultSend(inlineID);
} }
@ -953,6 +954,9 @@ MessageComposer.prototype.restoreSelection = function () {
MessageComposer.prototype.checkAutocomplete = function (forceFull) { MessageComposer.prototype.checkAutocomplete = function (forceFull) {
if (this.autocompleteShown && this.autoCompleteScope.type == 'inline') {
return;
}
var pos, value; var pos, value;
if (this.richTextareaEl) { if (this.richTextareaEl) {
var textarea = this.richTextareaEl[0]; var textarea = this.richTextareaEl[0];
@ -1469,6 +1473,7 @@ MessageComposer.prototype.updatePosition = function () {
} }
MessageComposer.prototype.hideSuggestions = function () { MessageComposer.prototype.hideSuggestions = function () {
// console.trace();
// return; // return;
this.autoCompleteWrapEl.hide(); this.autoCompleteWrapEl.hide();
delete this.autocompleteShown; delete this.autocompleteShown;

61
app/js/messages_manager.js

@ -1370,7 +1370,6 @@ angular.module('myApp.services')
} }
var apiPromise; var apiPromise;
if (options.viaBotID) { if (options.viaBotID) {
console.warn(options);
apiPromise = MtpApiManager.invokeApi('messages.sendInlineBotResult', { apiPromise = MtpApiManager.invokeApi('messages.sendInlineBotResult', {
flags: flags, flags: flags,
peer: AppPeersManager.getInputPeerByID(peerID), peer: AppPeersManager.getInputPeerByID(peerID),
@ -1441,31 +1440,6 @@ angular.module('myApp.services')
pendingByRandomID[randomIDS] = [peerID, messageID]; pendingByRandomID[randomIDS] = [peerID, messageID];
}; };
function sendInlineResult (peerID, qID, options) {
var inlineResult = inlineResults[qID];
if (inlineResult === undefined) {
return false;
}
var splitted = qID.split('_');
var queryID = splitted.shift();
var resultID = splitted.join('_');
options = options || {};
options.viaBotID = inlineResult.botID;
options.queryID = queryID;
options.resultID = resultID;
if (inlineResult.send_message._ == 'botInlineMessageText') {
options.entities = inlineResult.send_message.entities;
sendText(peerID, inlineResult.send_message.message, options);
} else {
sendOther(peerID, {
_: 'messageMediaPending',
size: 0,
progress: {percent: 33, total: 0}
}, options);
}
}
function sendFile(peerID, file, options) { function sendFile(peerID, file, options) {
options = options || {}; options = options || {};
var messageID = tempID--, var messageID = tempID--,
@ -1682,7 +1656,8 @@ angular.module('myApp.services')
case 'inputMediaPhoto': case 'inputMediaPhoto':
media = { media = {
_: 'messageMediaPhoto', _: 'messageMediaPhoto',
photo: AppPhotosManager.getPhoto(inputMedia.id.id) photo: AppPhotosManager.getPhoto(inputMedia.id.id),
caption: inputMedia.caption || ''
}; };
break; break;
@ -1693,7 +1668,8 @@ angular.module('myApp.services')
}; };
media = { media = {
_: 'messageMediaDocument', _: 'messageMediaDocument',
'document': doc 'document': doc,
caption: inputMedia.caption || ''
}; };
break; break;
@ -1770,7 +1746,6 @@ angular.module('myApp.services')
var apiPromise; var apiPromise;
if (options.viaBotID) { if (options.viaBotID) {
console.warn(options);
apiPromise = MtpApiManager.invokeApi('messages.sendInlineBotResult', { apiPromise = MtpApiManager.invokeApi('messages.sendInlineBotResult', {
flags: flags, flags: flags,
peer: AppPeersManager.getInputPeerByID(peerID), peer: AppPeersManager.getInputPeerByID(peerID),
@ -3073,32 +3048,6 @@ angular.module('myApp.services')
}) })
}); });
var inlineResults = {};
function getInlineResults (botID, query, offset) {
return MtpApiManager.invokeApi('messages.getInlineBotResults', {
bot: AppUsersManager.getUserInput(botID),
query: query,
offset: offset
}).then(function(botResults) {
var queryID = botResults.query_id;
delete botResults._;
delete botResults.flags;
delete botResults.query_id;
angular.forEach(botResults.results, function (result) {
var qID = queryID + '_' + result.id;
result.qID = qID;
result.botID = botID;
result.rTitle = RichTextProcessor.wrapRichText(result.title, {noLinebreaks: true, noLinks: true});
result.rDescription = RichTextProcessor.wrapRichText(result.description, {noLinebreaks: true, noLinks: true});
result.initials = (result.url || result.title || result.type || '').substr(0, 1)
inlineResults[qID] = result;
});
return botResults;
});
}
return { return {
getConversations: getConversations, getConversations: getConversations,
getHistory: getHistory, getHistory: getHistory,
@ -3120,8 +3069,6 @@ angular.module('myApp.services')
getMessagePeer: getMessagePeer, getMessagePeer: getMessagePeer,
getMessageThumb: getMessageThumb, getMessageThumb: getMessageThumb,
clearDialogCache: clearDialogCache, clearDialogCache: clearDialogCache,
getInlineResults: getInlineResults,
sendInlineResult: sendInlineResult,
wrapForDialog: wrapForDialog, wrapForDialog: wrapForDialog,
wrapForHistory: wrapForHistory, wrapForHistory: wrapForHistory,
wrapReplyMarkup: wrapReplyMarkup, wrapReplyMarkup: wrapReplyMarkup,

102
app/js/services.js

@ -11,7 +11,7 @@
angular.module('myApp.services', ['myApp.i18n', 'izhukov.utils']) angular.module('myApp.services', ['myApp.i18n', 'izhukov.utils'])
.service('AppUsersManager', function ($rootScope, $modal, $modalStack, $filter, $q, qSync, MtpApiFileManager, MtpApiManager, RichTextProcessor, ErrorService, Storage, _) { .service('AppUsersManager', function ($rootScope, $modal, $modalStack, $filter, $q, qSync, MtpApiManager, RichTextProcessor, ErrorService, Storage, _) {
var users = {}, var users = {},
usernames = {}, usernames = {},
userAccess = {}, userAccess = {},
@ -575,7 +575,7 @@ angular.module('myApp.services', ['myApp.i18n', 'izhukov.utils'])
}) })
.service('AppChatsManager', function ($q, $rootScope, $modal, _, MtpApiFileManager, MtpApiManager, AppUsersManager, AppPhotosManager, RichTextProcessor) { .service('AppChatsManager', function ($q, $rootScope, $modal, _, MtpApiManager, AppUsersManager, AppPhotosManager, RichTextProcessor) {
var chats = {}, var chats = {},
usernames = {}, usernames = {},
channelAccess = {}, channelAccess = {},
@ -2297,7 +2297,7 @@ angular.module('myApp.services', ['myApp.i18n', 'izhukov.utils'])
} }
}) })
.service('AppStickersManager', function ($q, $rootScope, $modal, _, FileManager, MtpApiManager, MtpApiFileManager, AppDocsManager, Storage, ApiUpdatesManager) { .service('AppStickersManager', function ($q, $rootScope, $modal, _, FileManager, MtpApiManager, AppDocsManager, Storage, ApiUpdatesManager) {
var started = false; var started = false;
var applied = false; var applied = false;
@ -2594,6 +2594,100 @@ angular.module('myApp.services', ['myApp.i18n', 'izhukov.utils'])
} }
}) })
.service('AppInlineBotsManager', function (MtpApiManager, AppMessagesManager, AppDocsManager, AppPhotosManager, RichTextProcessor, AppUsersManager) {
var inlineResults = {};
return {
sendInlineResult: sendInlineResult,
getInlineResults: getInlineResults
};
function getInlineResults (botID, query, offset) {
return MtpApiManager.invokeApi('messages.getInlineBotResults', {
bot: AppUsersManager.getUserInput(botID),
query: query,
offset: offset
}).then(function(botResults) {
var queryID = botResults.query_id;
delete botResults._;
delete botResults.flags;
delete botResults.query_id;
angular.forEach(botResults.results, function (result) {
var qID = queryID + '_' + result.id;
result.qID = qID;
result.botID = botID;
result.rTitle = RichTextProcessor.wrapRichText(result.title, {noLinebreaks: true, noLinks: true});
result.rDescription = RichTextProcessor.wrapRichText(result.description, {noLinebreaks: true, noLinks: true});
result.initials = (result.url || result.title || result.type || '').substr(0, 1)
if (result._ == 'botInlineMediaResultDocument') {
AppDocsManager.saveDoc(result.document);
}
else if (result._ == 'botInlineMediaResultPhoto') {
AppPhotosManager.savePhoto(result.photo);
}
inlineResults[qID] = result;
});
return botResults;
});
}
function sendInlineResult (peerID, qID, options) {
var inlineResult = inlineResults[qID];
if (inlineResult === undefined) {
return false;
}
var splitted = qID.split('_');
var queryID = splitted.shift();
var resultID = splitted.join('_');
options = options || {};
options.viaBotID = inlineResult.botID;
options.queryID = queryID;
options.resultID = resultID;
if (inlineResult.send_message._ == 'botInlineMessageText') {
options.entities = inlineResult.send_message.entities;
AppMessagesManager.sendText(peerID, inlineResult.send_message.message, options);
} else {
var caption = '';
if (inlineResult.send_message._ == 'botInlineMessageMediaAuto') {
caption = inlineResult.send_message.caption;
}
var inputMedia = false;
if (inlineResult._ == 'botInlineMediaResultDocument') {
var doc = inlineResult.document;
inputMedia = {
_: 'inputMediaDocument',
id: {_: 'inputDocument', id: doc.id, access_hash: doc.access_hash},
caption: caption
};
}
else if (inlineResult._ == 'botInlineMediaResultPhoto') {
var photo = inlineResult.photo;
inputMedia = {
_: 'inputMediaPhoto',
id: {_: 'inputPhoto', id: photo.id, access_hash: photo.access_hash},
caption: caption
};
}
if (!inputMedia) {
inputMedia = {
_: 'messageMediaPending',
type: inlineResult.type,
file_name: inlineResult.title || inlineResult.content_url || inlineResult.url,
size: 0,
progress: {percent: 30, total: 0}
};
}
AppMessagesManager.sendOther(peerID, inputMedia, options);
}
}
})
.service('ApiUpdatesManager', function ($rootScope, MtpNetworkerFactory, AppUsersManager, AppChatsManager, AppPeersManager, MtpApiManager) { .service('ApiUpdatesManager', function ($rootScope, MtpNetworkerFactory, AppUsersManager, AppChatsManager, AppPeersManager, MtpApiManager) {
var updatesState = { var updatesState = {
@ -4204,4 +4298,4 @@ angular.module('myApp.services', ['myApp.i18n', 'izhukov.utils'])
start: start, start: start,
shareUrl: shareUrl shareUrl: shareUrl
}; };
}) })

10
app/less/app.less

@ -2372,15 +2372,19 @@ textarea.im_message_field {
} }
.im_inline_placeholder_wrap { .im_inline_placeholder_wrap {
position: absolute; position: absolute;
left: 0;
margin-top: 2px; margin-top: 2px;
white-space: nowrap white-space: nowrap;
pointer-events: none;
display: none;
}
.im_inline_placeholder_wrap.active {
display: block;
} }
.im_inline_placeholder_prefix { .im_inline_placeholder_prefix {
visibility: hidden; visibility: hidden;
} }
.im_inline_placeholder { .im_inline_placeholder {
color: #999; color: #9aa2ab;
} }
.icon-online { .icon-online {

Loading…
Cancel
Save