Merge pull request #6712 from matrix-org/t3chguy/fix/18778
						commit
						e2468854f6
					
				|  | @ -50,7 +50,6 @@ import CallHandler from "./CallHandler"; | |||
| import { guessAndSetDMRoom } from "./Rooms"; | ||||
| import { upgradeRoom } from './utils/RoomUpgrade'; | ||||
| import UploadConfirmDialog from './components/views/dialogs/UploadConfirmDialog'; | ||||
| import ErrorDialog from './components/views/dialogs/ErrorDialog'; | ||||
| import DevtoolsDialog from './components/views/dialogs/DevtoolsDialog'; | ||||
| import RoomUpgradeWarningDialog from "./components/views/dialogs/RoomUpgradeWarningDialog"; | ||||
| import InfoDialog from "./components/views/dialogs/InfoDialog"; | ||||
|  | @ -245,21 +244,6 @@ export const Commands = [ | |||
|         }, | ||||
|         category: CommandCategories.messages, | ||||
|     }), | ||||
|     new Command({ | ||||
|         command: 'ddg', | ||||
|         args: '<query>', | ||||
|         description: _td('Searches DuckDuckGo for results'), | ||||
|         runFn: function() { | ||||
|             // TODO Don't explain this away, actually show a search UI here.
 | ||||
|             Modal.createTrackedDialog('Slash Commands', '/ddg is not a command', ErrorDialog, { | ||||
|                 title: _t('/ddg is not a command'), | ||||
|                 description: _t('To use it, just wait for autocomplete results to load and tab through them.'), | ||||
|             }); | ||||
|             return success(); | ||||
|         }, | ||||
|         category: CommandCategories.actions, | ||||
|         hideCompletionAfterSpace: true, | ||||
|     }), | ||||
|     new Command({ | ||||
|         command: 'upgraderoom', | ||||
|         args: '<new_version>', | ||||
|  |  | |||
|  | @ -20,7 +20,6 @@ import { Room } from 'matrix-js-sdk/src/models/room'; | |||
| 
 | ||||
| import CommandProvider from './CommandProvider'; | ||||
| import CommunityProvider from './CommunityProvider'; | ||||
| import DuckDuckGoProvider from './DuckDuckGoProvider'; | ||||
| import RoomProvider from './RoomProvider'; | ||||
| import UserProvider from './UserProvider'; | ||||
| import EmojiProvider from './EmojiProvider'; | ||||
|  | @ -55,7 +54,6 @@ const PROVIDERS = [ | |||
|     EmojiProvider, | ||||
|     NotifProvider, | ||||
|     CommandProvider, | ||||
|     DuckDuckGoProvider, | ||||
| ]; | ||||
| 
 | ||||
| if (SpaceStore.spacesEnabled) { | ||||
|  |  | |||
|  | @ -53,7 +53,7 @@ export default class CommandProvider extends AutocompleteProvider { | |||
|             // The input looks like a command with arguments, perform exact match
 | ||||
|             const name = command[1].substr(1); // strip leading `/`
 | ||||
|             if (CommandMap.has(name) && CommandMap.get(name).isEnabled()) { | ||||
|                 // some commands, namely `me` and `ddg` don't suit having the usage shown whilst typing their arguments
 | ||||
|                 // some commands, namely `me` don't suit having the usage shown whilst typing their arguments
 | ||||
|                 if (CommandMap.get(name).hideCompletionAfterSpace) return []; | ||||
|                 matches = [CommandMap.get(name)]; | ||||
|             } | ||||
|  |  | |||
|  | @ -1,115 +0,0 @@ | |||
| /* | ||||
| Copyright 2016 Aviral Dasgupta | ||||
| Copyright 2017 Vector Creations Ltd | ||||
| Copyright 2017, 2018 New Vector Ltd | ||||
| 
 | ||||
| Licensed under the Apache License, Version 2.0 (the "License"); | ||||
| you may not use this file except in compliance with the License. | ||||
| You may obtain a copy of the License at | ||||
| 
 | ||||
|     http://www.apache.org/licenses/LICENSE-2.0
 | ||||
| 
 | ||||
| Unless required by applicable law or agreed to in writing, software | ||||
| distributed under the License is distributed on an "AS IS" BASIS, | ||||
| WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||||
| See the License for the specific language governing permissions and | ||||
| limitations under the License. | ||||
| */ | ||||
| 
 | ||||
| import React from 'react'; | ||||
| import { _t } from '../languageHandler'; | ||||
| import AutocompleteProvider from './AutocompleteProvider'; | ||||
| 
 | ||||
| import { TextualCompletion } from './Components'; | ||||
| import { ICompletion, ISelectionRange } from "./Autocompleter"; | ||||
| 
 | ||||
| const DDG_REGEX = /\/ddg\s+(.+)$/g; | ||||
| const REFERRER = 'vector'; | ||||
| 
 | ||||
| export default class DuckDuckGoProvider extends AutocompleteProvider { | ||||
|     constructor() { | ||||
|         super(DDG_REGEX); | ||||
|     } | ||||
| 
 | ||||
|     static getQueryUri(query: string) { | ||||
|         return `https://api.duckduckgo.com/?q=${encodeURIComponent(query)}` | ||||
|          + `&format=json&no_redirect=1&no_html=1&t=${encodeURIComponent(REFERRER)}`; | ||||
|     } | ||||
| 
 | ||||
|     async getCompletions( | ||||
|         query: string, | ||||
|         selection: ISelectionRange, | ||||
|         force = false, | ||||
|         limit = -1, | ||||
|     ): Promise<ICompletion[]> { | ||||
|         const { command, range } = this.getCurrentCommand(query, selection); | ||||
|         if (!query || !command) { | ||||
|             return []; | ||||
|         } | ||||
| 
 | ||||
|         const response = await fetch(DuckDuckGoProvider.getQueryUri(command[1]), { | ||||
|             method: 'GET', | ||||
|         }); | ||||
|         const json = await response.json(); | ||||
|         const maxLength = limit > -1 ? limit : json.Results.length; | ||||
|         const results = json.Results.slice(0, maxLength).map((result) => { | ||||
|             return { | ||||
|                 completion: result.Text, | ||||
|                 component: ( | ||||
|                     <TextualCompletion | ||||
|                         title={result.Text} | ||||
|                         description={result.Result} /> | ||||
|                 ), | ||||
|                 range, | ||||
|             }; | ||||
|         }); | ||||
|         if (json.Answer) { | ||||
|             results.unshift({ | ||||
|                 completion: json.Answer, | ||||
|                 component: ( | ||||
|                     <TextualCompletion | ||||
|                         title={json.Answer} | ||||
|                         description={json.AnswerType} /> | ||||
|                 ), | ||||
|                 range, | ||||
|             }); | ||||
|         } | ||||
|         if (json.RelatedTopics && json.RelatedTopics.length > 0) { | ||||
|             results.unshift({ | ||||
|                 completion: json.RelatedTopics[0].Text, | ||||
|                 component: ( | ||||
|                     <TextualCompletion | ||||
|                         title={json.RelatedTopics[0].Text} /> | ||||
|                 ), | ||||
|                 range, | ||||
|             }); | ||||
|         } | ||||
|         if (json.AbstractText) { | ||||
|             results.unshift({ | ||||
|                 completion: json.AbstractText, | ||||
|                 component: ( | ||||
|                     <TextualCompletion | ||||
|                         title={json.AbstractText} /> | ||||
|                 ), | ||||
|                 range, | ||||
|             }); | ||||
|         } | ||||
|         return results; | ||||
|     } | ||||
| 
 | ||||
|     getName() { | ||||
|         return '🔍 ' + _t('Results from DuckDuckGo'); | ||||
|     } | ||||
| 
 | ||||
|     renderCompletions(completions: React.ReactNode[]): React.ReactNode { | ||||
|         return ( | ||||
|             <div | ||||
|                 className="mx_Autocomplete_Completion_container_block" | ||||
|                 role="presentation" | ||||
|                 aria-label={_t("DuckDuckGo Results")} | ||||
|             > | ||||
|                 { completions } | ||||
|             </div> | ||||
|         ); | ||||
|     } | ||||
| } | ||||
|  | @ -426,9 +426,6 @@ | |||
|     "Prepends ( ͡° ͜ʖ ͡°) to a plain-text message": "Prepends ( ͡° ͜ʖ ͡°) to a plain-text message", | ||||
|     "Sends a message as plain text, without interpreting it as markdown": "Sends a message as plain text, without interpreting it as markdown", | ||||
|     "Sends a message as html, without interpreting it as markdown": "Sends a message as html, without interpreting it as markdown", | ||||
|     "Searches DuckDuckGo for results": "Searches DuckDuckGo for results", | ||||
|     "/ddg is not a command": "/ddg is not a command", | ||||
|     "To use it, just wait for autocomplete results to load and tab through them.": "To use it, just wait for autocomplete results to load and tab through them.", | ||||
|     "Upgrades a room to a new version": "Upgrades a room to a new version", | ||||
|     "You do not have the required permissions to use this command.": "You do not have the required permissions to use this command.", | ||||
|     "Changes your display nickname": "Changes your display nickname", | ||||
|  | @ -3002,8 +2999,6 @@ | |||
|     "Commands": "Commands", | ||||
|     "Command Autocomplete": "Command Autocomplete", | ||||
|     "Community Autocomplete": "Community Autocomplete", | ||||
|     "Results from DuckDuckGo": "Results from DuckDuckGo", | ||||
|     "DuckDuckGo Results": "DuckDuckGo Results", | ||||
|     "Emoji": "Emoji", | ||||
|     "Emoji Autocomplete": "Emoji Autocomplete", | ||||
|     "Notify the whole room": "Notify the whole room", | ||||
|  |  | |||
		Loading…
	
		Reference in New Issue
	
	 Michael Telatynski
						Michael Telatynski