-
Notifications
You must be signed in to change notification settings - Fork 0
/
background.js
124 lines (112 loc) · 3.02 KB
/
background.js
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
const NEW_USER = {
id: 'local',
frequency: 'never',
timeout: '5',
};
let cachedUser;
let cachedSetup = '';
let cachedPunchline = '';
let notificationAlarm;
const createAlarm = (period) => {
notificationAlarm = chrome.alarms.create('myAlarm', {
delayInMinutes: period,
});
};
const randomNum = (max, min) => {
return Math.max(Math.round(Math.random() * max), min);
};
const setAlarm = ({ frequency }) => {
chrome.alarms.clearAll();
switch (frequency) {
case 'veryHigh':
createAlarm(randomNum(1, 5));
break;
case 'high':
createAlarm(randomNum(10, 30));
case 'medium':
createAlarm(randomNum(40, 70));
break;
case 'low':
createAlarm(randomNum(60, 120));
break;
default:
}
};
chrome.alarms.onAlarm.addListener(function(alarm) {
chrome.tabs.query({ active: true, currentWindow: true }, async (tabs) => {
if (tabs && tabs[0] && tabs[0].id) {
tellDadJoke('background', () => {});
}
});
if (cachedUser) {
setAlarm(cachedUser);
}
});
const getUserData = (cb) => {
chrome.storage.sync.get('user', async ({ user }) => {
let foundUser = user;
if (!foundUser || !foundUser.id) {
foundUser = NEW_USER;
chrome.storage.sync.set({ user: NEW_USER });
}
cachedUser = foundUser;
if (!cachedPunchline || !cachedSetup) {
await getJoke();
}
cb(foundUser);
});
};
const setUserTimeout = (value, cb) => {
const updatedUser = { ...cachedUser, timeout: value };
chrome.storage.sync.set({ user: updatedUser }, () => {
cb(updatedUser);
});
};
const setUserFrequency = (value, cb) => {
const updatedUser = { ...cachedUser, frequency: value };
chrome.storage.sync.set({ user: updatedUser }, () => {
setAlarm(updatedUser);
cb(updatedUser);
});
};
const getJoke = async () => {
const setupJoke = await fetch(
'https://official-joke-api.appspot.com/random_joke',
);
const { setup, punchline } = await setupJoke.json();
cachedSetup = setup;
cachedPunchline = punchline;
};
const tellDadJoke = (source, sendResponse) => {
chrome.tabs.query({ active: true, currentWindow: true }, async (tabs) => {
if (!cachedPunchline || !cachedSetup) {
await getJoke();
}
// send a mesage to that active tab
chrome.tabs.sendMessage(tabs[0].id, {
action: 'tellJoke',
punchline: cachedPunchline,
setup: cachedSetup,
userFrequency: cachedUser.frequency,
userTimeout: cachedUser.timeout,
source: source || 'background',
});
await getJoke();
sendResponse(cachedUser);
});
};
chrome.runtime.onMessage.addListener((message, sender, sendResponse) => {
if (message.type === 'getUser') {
getUserData(sendResponse);
}
if (message.type === 'setTimeout') {
setUserTimeout(message.value, sendResponse);
}
if (message.type === 'setFrequency') {
setUserFrequency(message.value, sendResponse);
}
if (message.type === 'getJoke') {
tellDadJoke(message.source, sendResponse);
}
return true; // keep the messaging channel open for sendResponse
});