/
index.js
executable file
·137 lines (118 loc) · 2.86 KB
/
index.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
125
126
127
128
129
130
131
132
133
134
135
136
137
#!/usr/local/bin/node
// Yeah I know request is deprecated
// But it makes the cookie jar super easy
const request = require("request")
const providers = require("./providers")
async function main () {
try {
const domains = await findDomains()
const items = domains.map(d => ({
valid: true,
uid: d.domain,
title: d.domain,
subtitle: d.provider,
autocomplete: d.domain,
arg: d.provider_url,
icon: {
type: "file",
path: "/System/Library/CoreServices/CoreTypes.bundle/Contents/Resources/BookmarkIcon.icns",
}
}))
await display(items)
} catch (err) {
if (err.error_code === "login") {
err = "Please provide a new hover auth cookie"
} else if (err.error) {
err = err.error
}
await display([
{
valid: false,
uid: "err",
title: `${err}`,
},
])
}
}
/**
* @return {Promise<Domain[]>
*/
async function findDomains () {
const results = await Promise.all([
findDomainsOnHover(),
])
return results.flat()
}
/**
* @return {Promise<Domain[]>
*/
async function findDomainsOnHover () {
const provider = providers.hover
if (provider.cookies.length > 0) {
// OK
} else if (provider.username && provider.password) {
throw new Error("Username and password not yet supported")
} else {
throw new Error("Please specify cookies or username/password")
}
// Create request wrapper, enabling json and cookies
const jar = request.jar()
provider.cookies.forEach(cookie => {
jar.setCookie(cookie, "https://www.hover.com")
})
const r = request.defaults({
baseUrl: "https://www.hover.com/api/",
jar,
json: true,
})
/**
* @param {string} path
* @param {import("request").CoreOptions} opts
**/
const req = async function (path, opts = {}) {
return new Promise((resolve, reject) => {
r(path, opts, function (err, res, data) {
if (err) {
reject(err)
} else if (!res || res.statusCode > 400) {
reject(data)
} else {
resolve(data)
}
})
})
}
// Log in to hover
if (!provider.cookies.length) {
await req("login", {
method: "POST",
body: {
username: provider.username,
password: provider.password,
},
headers: {
"Content-Type": "application/json"
}
})
}
// Get list of domains
const response = await req("/domains")
return response.domains.map(item => ({
domain: item.domain_name,
provider: "hover",
provider_url: `https://www.hover.com/control_panel/domain/${item.domain_name}`,
}))
}
async function display(items) {
console.log(JSON.stringify({
items,
}))
}
main()
/** @typedef {"hover"} Provider */
/**
* @typedef {object} Domain
* @property {Provider} provider
* @property {string} domain
* @property {string} provider_url
**/