-
Notifications
You must be signed in to change notification settings - Fork 3
Expand file tree
/
Copy pathupdates.js
More file actions
137 lines (133 loc) · 4.09 KB
/
updates.js
File metadata and controls
137 lines (133 loc) · 4.09 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
// Check for script updates
wrap(() => {
const disabled = settings.register({
name: 'Disable Auto Updates',
key: 'underscript.disable.updates',
});
style.add(
'#AlertToast h2, #AlertToast h3 { margin: 0; font-size: 20px; }',
'#AlertToast h3 {font-size: 17px; }',
);
const baseURL = 'https://unpkg.com/';
const MINUTE = 60 * 1000, HOUR = 60 * MINUTE;
const CHECKING = 'underscript.update.checking', LAST = 'underscript.update.last', DEBUG = 'underscript.debug.update', LATEST = 'underscript.update.latest';
const base = axios.create({ baseURL });
const latest = {
set({version, unpkg}) {
if (!version || !unpkg) return;
localStorage.setItem(LATEST, JSON.stringify({
version, unpkg,
time: Date.now(),
}));
},
del() {
localStorage.removeItem(LATEST);
},
chk() {
const latest = JSON.parse(localStorage.getItem(LATEST));
if (latest) {
return compareAndToast(latest);
}
},
};
let toast, updateToast, autoTimeout;
function check() {
if (localStorage.getItem(CHECKING)) return Promise.resolve();
localStorage.setItem(CHECKING, true);
return base.get(`underscript@${getVersion()}/package.json`).then((response) => {
localStorage.removeItem(CHECKING);
localStorage.setItem(LAST, Date.now());
return response;
}).catch((error) => {
localStorage.removeItem(CHECKING);
fn.debug(error);
if (toast) {
toast.setText('Failed to connect to server.');
}
});
}
function noUpdateFound() {
const ref = toast;
if (ref && ref.exists()) {
ref.setText('No updates available.');
setTimeout(ref.close, 3000);
}
}
function isNewer(data) {
const version = scriptVersion;
if ((version === 'L' || version.includes('-')) && !localStorage.getItem(DEBUG)) return false;
if (data.time && data.time < GM_info.script.lastModified) return false;
return data.version !== version;
}
function compareAndToast(data) {
if (!isNewer(data)) {
latest.del();
return;
}
latest.set(data);
updateToast = fn.toast({
title: '[UnderScript] Update Available!',
text: `Version ${data.version}.`,
footer: 'Click to update',
onClose(reason) {
if (reason !== 'dismissed') return;
location.href = `${baseURL}/underscript@${data.version}/${data.unpkg}`;
},
});
return true;
}
function autoCheck() {
// It passed, don't need to check anymore
if (latest.chk()) return;
check().then(({data} = {}) => {
if (data) {
compareAndToast(data);
}
// One hour from now or one minute from now (if an error occurred)
autoTimeout = setTimeout(autoCheck, data ? HOUR : MINUTE);
});
}
// Frequency - when should it check for updates
// Menu button - Manual update check
menu.addButton({
text: 'Check for updates',
action() {
if (updateToast && updateToast.exists()) return;
if (toast) toast.close();
toast = fn.toast({
title: 'UnderScript updater',
text: 'Checking for updates. Please wait.'
});
check().then(({ data } = {}) => {
setupAuto(); // Setup a new auto check (wait another hour)
if (!data) return;
if (!isNewer(data)) {
noUpdateFound();
} else {
toast.close(); // I need a way to change the 'onclose'
compareAndToast(data);
}
});
},
note() {
const last = parseInt(localStorage.getItem(LAST));
return `Last Checked: ${last ? luxon.DateTime.fromMillis(last).toLocaleString(luxon.DateTime.DATETIME_FULL) : 'never'}`
}
});
function setupAuto() {
if (disabled.value()) return;
if (autoTimeout) clearTimeout(autoTimeout);
const last = parseInt(localStorage.getItem(LAST));
const now = Date.now();
const timeout = last - now + HOUR;
if (!last || timeout <= 0) {
autoCheck();
} else {
autoTimeout = setTimeout(autoCheck, timeout);
}
}
function getVersion() {
return scriptVersion.includes('-') ? 'next' : 'latest';
}
if (!latest.chk()) setupAuto();
});