-
-
Notifications
You must be signed in to change notification settings - Fork 18
Expand file tree
/
Copy pathbot.ts
More file actions
161 lines (143 loc) · 5.63 KB
/
bot.ts
File metadata and controls
161 lines (143 loc) · 5.63 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
/*---------------------------------------------------------------------------------------------
* Copyright (c) Rowe Wilson Frederisk Holme. All rights reserved.
* Licensed under the MIT License. See License.txt in the project root for license information.
*--------------------------------------------------------------------------------------------*/
import MWBot from 'mwbot';
import * as vscode from 'vscode';
import { Action, Meta } from './args';
import { showMWErrorMessage } from './err_msg';
let bot: MWBot | undefined;
export function loginFactory() {
return login;
}
export function logoutFactory() {
return async function logout(): Promise<void> {
await bot?.getEditToken();
const barMessage: vscode.Disposable = vscode.window.setStatusBarMessage("Wikitext: Logout...");
try {
// it will be {} if success
await bot?.request({
'action': Action.logout,
'token': bot.editToken
}, { method: 'POST' });
// clear bot
bot = undefined;
vscode.window.showInformationMessage('result: Success');
}
catch (error) {
showMWErrorMessage('logout', error);
}
finally {
barMessage.dispose();
}
};
}
async function login(): Promise<boolean> {
const config: vscode.WorkspaceConfiguration = vscode.workspace.getConfiguration("wikitext");
const userInfo: { username?: string; password?: string } = {
username: config.get('userName'),
password: config.get('password')
};
if (!userInfo.username || !userInfo.password) {
vscode.window.showWarningMessage("You have not filled in the user name or password, please go to the settings to edit them and try again.");
return false;
}
const barMessage: vscode.Disposable = vscode.window.setStatusBarMessage("Wikitext: Login...");
try {
bot = new MWBot({
apiUrl: config.get("transferProtocol") as string + config.get('host') + config.get("apiPath")
});
// TODO:
const response: any = await bot.login(userInfo);
if (response.result === 'Success') {
vscode.window.showInformationMessage(`User "${response.lgusername}"(UserID:"${response.lguserid}") Login Result is "${response.result}". Login Token is "${response.token}".`
);
return true;
}
else {
vscode.window.showErrorMessage(`User "${response.lgusername}"(UserID:"${response.lguserid}") Login Result is "${response.result}". Login Token is "${response.token}".`
);
return false;
}
}
catch (error) {
bot = undefined;
showMWErrorMessage('login', error);
return false;
}
finally {
barMessage.dispose();
}
}
export async function getDefaultBot(): Promise<MWBot | undefined> {
const config: vscode.WorkspaceConfiguration = vscode.workspace.getConfiguration("wikitext");
let tBot: MWBot;
if (bot) {
tBot = bot;
} else {
tBot = await getLoggedInBot() ?? new MWBot({
apiUrl: config.get("transferProtocol") as string + config.get('host') + config.get("apiPath")
});
}
return tBot;
}
export async function getLoggedInBot(): Promise<MWBot | undefined> {
const config: vscode.WorkspaceConfiguration = vscode.workspace.getConfiguration("wikitext");
// if bot is not be created or not logged in
if (bot === undefined || !bot.loggedIn) {
switch (config.get('autoLogin')) {
case 'Always':
return await login() ? bot : undefined;
case 'Never':
vscode.window.showWarningMessage('Notice: You are not logged in.');
return undefined;
case 'Ask me':
default:
switch (await vscode.window.showWarningMessage("You are not logged in. Do you want to login now?", 'Yes', 'No', 'Always', 'Never')) {
case 'Always':
config.update('autoLogin', 'Always', true);
return await login() ? bot : undefined;
case 'Yes':
return await login() ? bot : undefined;
case 'Never':
config.update('autoLogin', 'Never', true);
return undefined;
case 'No':
case undefined:
default:
return undefined;
}
}
}
return bot;
}
export async function compareVersion(tBot: MWBot, major: number, minor: number, revision: number): Promise<boolean | undefined> {
// if (bot === undefined) {
// return undefined;
// }
const args: Record<string, string> = {
action: Action.query,
meta: Meta.siteInfo,
};
const result: unknown = await tBot.request(args, { method: 'GET' });
const re: any = result as any;
// TODO: cast
const generator: string = re.query.general.generator;
const generatorInfo: RegExpMatchArray | null = generator.match(/^MediaWiki ([0-9]+)\.([0-9]+)\.([0-9]+)(.*)$/);
if (generatorInfo === null) {
return undefined;
}
const siteMajor: number = parseInt(generatorInfo[1]!, 10);
const siteMinor: number = parseInt(generatorInfo[2]!, 10);
const siteRevision: number = parseInt(generatorInfo[3]!, 10);
if (isNaN(siteMajor + siteMinor + siteRevision)) {
return undefined;
}
if (siteMajor !== major) {
return siteMajor > major;
}
if (siteMinor !== minor) {
return siteMinor > minor;
}
return siteRevision >= revision;
}