Heroku
tcp/443 tcp/80
Exposing Swagger/OpenAPI documentation is primarily a risk if your API has underlying security flaws, as it gives attackers a precise roadmap to find them.
Those detail every endpoint, parameter, and data model, making it easier to discover and exploit vulnerabilities like broken access control or injection points.
While a perfectly secure API mitigates the danger, protecting your documentation is a critical layer of defense that forces attackers to work without a map.
Severity: info
Fingerprint: 5733ddf49ff49cd1b885ff4304e95679b8b3f0e81f43ae79ad047cddad047cdd
Public Swagger UI/API detected at path: /swagger.json - sample paths:
GET /command
GET /command/{commandId}
GET /health
POST /webhook/groupme
Exposing Swagger/OpenAPI documentation is primarily a risk if your API has underlying security flaws, as it gives attackers a precise roadmap to find them.
Those detail every endpoint, parameter, and data model, making it easier to discover and exploit vulnerabilities like broken access control or injection points.
While a perfectly secure API mitigates the danger, protecting your documentation is a critical layer of defense that forces attackers to work without a map.
Severity: info
Fingerprint: 5733ddf49ff49cd1b885ff4304e95679b8b3f0e81f43ae79ad047cddad047cdd
Public Swagger UI/API detected at path: /swagger.json - sample paths:
GET /command
GET /command/{commandId}
GET /health
POST /webhook/groupme
Open service 99.83.220.108:80 · ffbot.whitacre.dev
2026-01-09 18:58
HTTP/1.1 200 OK
Accept-Ranges: bytes
Cache-Control: no-cache
Content-Length: 3493
Content-Type: text/html; charset=utf-8
Date: Fri, 09 Jan 2026 19:00:02 GMT
Etag: "a28c32895caa141bed18dc2700ec2381f0ca3c64"
Last-Modified: Tue, 19 Sep 2023 01:54:06 GMT
Nel: {"report_to":"heroku-nel","response_headers":["Via"],"max_age":3600,"success_fraction":0.01,"failure_fraction":0.1}
Report-To: {"group":"heroku-nel","endpoints":[{"url":"https://nel.heroku.com/reports?s=YhH9LNvmd%2FypkEPXjxkfo8OaLNH6qUEch3Q5r3oOJOI%3D\u0026sid=1b10b0ff-8a76-4548-befa-353fc6c6c045\u0026ts=1767985202"}],"max_age":3600}
Reporting-Endpoints: heroku-nel="https://nel.heroku.com/reports?s=YhH9LNvmd%2FypkEPXjxkfo8OaLNH6qUEch3Q5r3oOJOI%3D&sid=1b10b0ff-8a76-4548-befa-353fc6c6c045&ts=1767985202"
Server: Heroku
Vary: accept-encoding
Via: 1.1 heroku-router
Connection: close
Page title: Fantasy Football Bot
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<title>Fantasy Football Bot</title>
<link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Roboto:300,300italic,700,700italic" />
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/normalize/3.0.3/normalize.css" />
<link rel="stylesheet" href="./styles/milligram.min.css" />
<link rel="stylesheet" href="./styles/main.css" />
</head>
<body>
<main class="wrapper">
<nav class="navigation">
<section class="container" id="navigation">
<h1 class="title">Fantasy Football Bot</h1>
</section>
</nav>
<section class="container" id="commands">
<h3>Commands</h3>
<select id="sheetId">
<option value="17X4gGMBjTqyXnIVtAiGOJ7tUdn5Uov2J2Ax6bNN7SvI">The Carrie 2023: Babygate</option>
<option value="10hFp2dc2_f8-sgnGRsRYCJtdLi95wtI_u_QPLcBaMIU">Playstation Group</option>
<option value="19pQBVOJmrbYlaHxMQnHKvTLBY0Ru8GLvD6r_VD3lF9c">fantasy-football-bot-dev (dev)</option>
<option value="defaults">fantasy-football-bot-dev (defaults)</option>
</select>
<table>
<thead>
<tr>
<th>Command</th>
<th>Description</th>
<th>Message</th>
<th>Picture</th>
<th title="Whether the bot responds to the command.">Enabled</th>
<th title="Shows in the !list command.">Visible</th>
</tr>
</thead>
<tbody id="commands-table-body"></tbody>
</table>
</section>
<section class="container" id="failed" style="display:none">
<p>
Sorry, the commands failed to load. Maybe refresh? ¯\_(ツ)_/¯
</p>
</section>
<footer class="footer">
<section class="container ">
<p>
Made with ♥ by Dan.
</p>
</section>
</footer>
</main>
</body>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.7.0/jquery.min.js"></script>
<script>
;(function() {
function failed() {
$('#commands').hide()
$('#failed').show()
}
function td(text) {
return $('<td>').text(text)
}
function sortCommands(array) {
return array
.sort((a, b) => a.id.localeCompare(b.id))
}
function append(tbody, array) {
var tbody = $(tbody)
array.forEach(function(item) {
var tr = $('<tr>')
.append(td(`!${item.id}`))
.append(td(item.desc))
.append(td(item.message))
.append(item.pictureurl ? td().append($('<img>').attr('src', item.pictureurl).attr('width', 96).attr('height', 96)) : td(''))
.append(td(item.enabled ? '✔️' : '❌'))
.append(td(item.hidden ? '❌' : '✔️'))
tbody.append(tr)
})
}
function load() {
$('#commands-table-body').empty()
$.get(`./command?sheetId=${$('#sheetId').val()}`, function(data) {
if (!data?.commands) return failed()
const commands = sortCommands(data.commands ?? [])
var cacheBody = $('#commands-table-body')
append(cacheBody, commands)
}).fail(failed)
}
$('#sheetId').on('change', load)
load()
})()
</script>
</html>
Open service 35.71.179.82:443 · ffbot.whitacre.dev
2026-01-09 05:06
HTTP/1.1 200 OK
Accept-Ranges: bytes
Cache-Control: no-cache
Content-Length: 3493
Content-Type: text/html; charset=utf-8
Date: Fri, 09 Jan 2026 05:06:04 GMT
Etag: "a28c32895caa141bed18dc2700ec2381f0ca3c64"
Last-Modified: Tue, 19 Sep 2023 01:54:06 GMT
Nel: {"report_to":"heroku-nel","response_headers":["Via"],"max_age":3600,"success_fraction":0.01,"failure_fraction":0.1}
Report-To: {"group":"heroku-nel","endpoints":[{"url":"https://nel.heroku.com/reports?s=eRRya6sk%2Fjz%2FS94RSxQ7kVcW5BahAU7qKQm3MQKlH%2F8%3D\u0026sid=1b10b0ff-8a76-4548-befa-353fc6c6c045\u0026ts=1767935164"}],"max_age":3600}
Reporting-Endpoints: heroku-nel="https://nel.heroku.com/reports?s=eRRya6sk%2Fjz%2FS94RSxQ7kVcW5BahAU7qKQm3MQKlH%2F8%3D&sid=1b10b0ff-8a76-4548-befa-353fc6c6c045&ts=1767935164"
Server: Heroku
Vary: accept-encoding
Via: 1.1 heroku-router
Connection: close
Page title: Fantasy Football Bot
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<title>Fantasy Football Bot</title>
<link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Roboto:300,300italic,700,700italic" />
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/normalize/3.0.3/normalize.css" />
<link rel="stylesheet" href="./styles/milligram.min.css" />
<link rel="stylesheet" href="./styles/main.css" />
</head>
<body>
<main class="wrapper">
<nav class="navigation">
<section class="container" id="navigation">
<h1 class="title">Fantasy Football Bot</h1>
</section>
</nav>
<section class="container" id="commands">
<h3>Commands</h3>
<select id="sheetId">
<option value="17X4gGMBjTqyXnIVtAiGOJ7tUdn5Uov2J2Ax6bNN7SvI">The Carrie 2023: Babygate</option>
<option value="10hFp2dc2_f8-sgnGRsRYCJtdLi95wtI_u_QPLcBaMIU">Playstation Group</option>
<option value="19pQBVOJmrbYlaHxMQnHKvTLBY0Ru8GLvD6r_VD3lF9c">fantasy-football-bot-dev (dev)</option>
<option value="defaults">fantasy-football-bot-dev (defaults)</option>
</select>
<table>
<thead>
<tr>
<th>Command</th>
<th>Description</th>
<th>Message</th>
<th>Picture</th>
<th title="Whether the bot responds to the command.">Enabled</th>
<th title="Shows in the !list command.">Visible</th>
</tr>
</thead>
<tbody id="commands-table-body"></tbody>
</table>
</section>
<section class="container" id="failed" style="display:none">
<p>
Sorry, the commands failed to load. Maybe refresh? ¯\_(ツ)_/¯
</p>
</section>
<footer class="footer">
<section class="container ">
<p>
Made with ♥ by Dan.
</p>
</section>
</footer>
</main>
</body>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.7.0/jquery.min.js"></script>
<script>
;(function() {
function failed() {
$('#commands').hide()
$('#failed').show()
}
function td(text) {
return $('<td>').text(text)
}
function sortCommands(array) {
return array
.sort((a, b) => a.id.localeCompare(b.id))
}
function append(tbody, array) {
var tbody = $(tbody)
array.forEach(function(item) {
var tr = $('<tr>')
.append(td(`!${item.id}`))
.append(td(item.desc))
.append(td(item.message))
.append(item.pictureurl ? td().append($('<img>').attr('src', item.pictureurl).attr('width', 96).attr('height', 96)) : td(''))
.append(td(item.enabled ? '✔️' : '❌'))
.append(td(item.hidden ? '❌' : '✔️'))
tbody.append(tr)
})
}
function load() {
$('#commands-table-body').empty()
$.get(`./command?sheetId=${$('#sheetId').val()}`, function(data) {
if (!data?.commands) return failed()
const commands = sortCommands(data.commands ?? [])
var cacheBody = $('#commands-table-body')
append(cacheBody, commands)
}).fail(failed)
}
$('#sheetId').on('change', load)
load()
})()
</script>
</html>
Open service 99.83.220.108:80 · ffbot.whitacre.dev
2026-01-02 04:12
HTTP/1.1 200 OK
Accept-Ranges: bytes
Cache-Control: no-cache
Content-Length: 3493
Content-Type: text/html; charset=utf-8
Date: Fri, 02 Jan 2026 04:12:24 GMT
Etag: "a28c32895caa141bed18dc2700ec2381f0ca3c64"
Last-Modified: Tue, 19 Sep 2023 01:54:06 GMT
Nel: {"report_to":"heroku-nel","response_headers":["Via"],"max_age":3600,"success_fraction":0.01,"failure_fraction":0.1}
Report-To: {"group":"heroku-nel","endpoints":[{"url":"https://nel.heroku.com/reports?s=iyOAX%2FSA56w097j6YyAuUQDun%2F%2Fbq4ZR8vnNPDfZa%2BE%3D\u0026sid=1b10b0ff-8a76-4548-befa-353fc6c6c045\u0026ts=1767327144"}],"max_age":3600}
Reporting-Endpoints: heroku-nel="https://nel.heroku.com/reports?s=iyOAX%2FSA56w097j6YyAuUQDun%2F%2Fbq4ZR8vnNPDfZa%2BE%3D&sid=1b10b0ff-8a76-4548-befa-353fc6c6c045&ts=1767327144"
Server: Heroku
Vary: accept-encoding
Via: 1.1 heroku-router
Connection: close
Page title: Fantasy Football Bot
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<title>Fantasy Football Bot</title>
<link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Roboto:300,300italic,700,700italic" />
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/normalize/3.0.3/normalize.css" />
<link rel="stylesheet" href="./styles/milligram.min.css" />
<link rel="stylesheet" href="./styles/main.css" />
</head>
<body>
<main class="wrapper">
<nav class="navigation">
<section class="container" id="navigation">
<h1 class="title">Fantasy Football Bot</h1>
</section>
</nav>
<section class="container" id="commands">
<h3>Commands</h3>
<select id="sheetId">
<option value="17X4gGMBjTqyXnIVtAiGOJ7tUdn5Uov2J2Ax6bNN7SvI">The Carrie 2023: Babygate</option>
<option value="10hFp2dc2_f8-sgnGRsRYCJtdLi95wtI_u_QPLcBaMIU">Playstation Group</option>
<option value="19pQBVOJmrbYlaHxMQnHKvTLBY0Ru8GLvD6r_VD3lF9c">fantasy-football-bot-dev (dev)</option>
<option value="defaults">fantasy-football-bot-dev (defaults)</option>
</select>
<table>
<thead>
<tr>
<th>Command</th>
<th>Description</th>
<th>Message</th>
<th>Picture</th>
<th title="Whether the bot responds to the command.">Enabled</th>
<th title="Shows in the !list command.">Visible</th>
</tr>
</thead>
<tbody id="commands-table-body"></tbody>
</table>
</section>
<section class="container" id="failed" style="display:none">
<p>
Sorry, the commands failed to load. Maybe refresh? ¯\_(ツ)_/¯
</p>
</section>
<footer class="footer">
<section class="container ">
<p>
Made with ♥ by Dan.
</p>
</section>
</footer>
</main>
</body>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.7.0/jquery.min.js"></script>
<script>
;(function() {
function failed() {
$('#commands').hide()
$('#failed').show()
}
function td(text) {
return $('<td>').text(text)
}
function sortCommands(array) {
return array
.sort((a, b) => a.id.localeCompare(b.id))
}
function append(tbody, array) {
var tbody = $(tbody)
array.forEach(function(item) {
var tr = $('<tr>')
.append(td(`!${item.id}`))
.append(td(item.desc))
.append(td(item.message))
.append(item.pictureurl ? td().append($('<img>').attr('src', item.pictureurl).attr('width', 96).attr('height', 96)) : td(''))
.append(td(item.enabled ? '✔️' : '❌'))
.append(td(item.hidden ? '❌' : '✔️'))
tbody.append(tr)
})
}
function load() {
$('#commands-table-body').empty()
$.get(`./command?sheetId=${$('#sheetId').val()}`, function(data) {
if (!data?.commands) return failed()
const commands = sortCommands(data.commands ?? [])
var cacheBody = $('#commands-table-body')
append(cacheBody, commands)
}).fail(failed)
}
$('#sheetId').on('change', load)
load()
})()
</script>
</html>
Open service 35.71.179.82:443 · ffbot.whitacre.dev
2026-01-02 01:55
HTTP/1.1 200 OK
Accept-Ranges: bytes
Cache-Control: no-cache
Content-Length: 3493
Content-Type: text/html; charset=utf-8
Date: Fri, 02 Jan 2026 01:55:35 GMT
Etag: "a28c32895caa141bed18dc2700ec2381f0ca3c64"
Last-Modified: Tue, 19 Sep 2023 01:54:06 GMT
Nel: {"report_to":"heroku-nel","response_headers":["Via"],"max_age":3600,"success_fraction":0.01,"failure_fraction":0.1}
Report-To: {"group":"heroku-nel","endpoints":[{"url":"https://nel.heroku.com/reports?s=qOyM4lMU4LNY6IShpBHoCoEBhfVVk%2Bcg7fsT%2FzuO%2FR4%3D\u0026sid=1b10b0ff-8a76-4548-befa-353fc6c6c045\u0026ts=1767318935"}],"max_age":3600}
Reporting-Endpoints: heroku-nel="https://nel.heroku.com/reports?s=qOyM4lMU4LNY6IShpBHoCoEBhfVVk%2Bcg7fsT%2FzuO%2FR4%3D&sid=1b10b0ff-8a76-4548-befa-353fc6c6c045&ts=1767318935"
Server: Heroku
Vary: accept-encoding
Via: 1.1 heroku-router
Connection: close
Page title: Fantasy Football Bot
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<title>Fantasy Football Bot</title>
<link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Roboto:300,300italic,700,700italic" />
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/normalize/3.0.3/normalize.css" />
<link rel="stylesheet" href="./styles/milligram.min.css" />
<link rel="stylesheet" href="./styles/main.css" />
</head>
<body>
<main class="wrapper">
<nav class="navigation">
<section class="container" id="navigation">
<h1 class="title">Fantasy Football Bot</h1>
</section>
</nav>
<section class="container" id="commands">
<h3>Commands</h3>
<select id="sheetId">
<option value="17X4gGMBjTqyXnIVtAiGOJ7tUdn5Uov2J2Ax6bNN7SvI">The Carrie 2023: Babygate</option>
<option value="10hFp2dc2_f8-sgnGRsRYCJtdLi95wtI_u_QPLcBaMIU">Playstation Group</option>
<option value="19pQBVOJmrbYlaHxMQnHKvTLBY0Ru8GLvD6r_VD3lF9c">fantasy-football-bot-dev (dev)</option>
<option value="defaults">fantasy-football-bot-dev (defaults)</option>
</select>
<table>
<thead>
<tr>
<th>Command</th>
<th>Description</th>
<th>Message</th>
<th>Picture</th>
<th title="Whether the bot responds to the command.">Enabled</th>
<th title="Shows in the !list command.">Visible</th>
</tr>
</thead>
<tbody id="commands-table-body"></tbody>
</table>
</section>
<section class="container" id="failed" style="display:none">
<p>
Sorry, the commands failed to load. Maybe refresh? ¯\_(ツ)_/¯
</p>
</section>
<footer class="footer">
<section class="container ">
<p>
Made with ♥ by Dan.
</p>
</section>
</footer>
</main>
</body>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.7.0/jquery.min.js"></script>
<script>
;(function() {
function failed() {
$('#commands').hide()
$('#failed').show()
}
function td(text) {
return $('<td>').text(text)
}
function sortCommands(array) {
return array
.sort((a, b) => a.id.localeCompare(b.id))
}
function append(tbody, array) {
var tbody = $(tbody)
array.forEach(function(item) {
var tr = $('<tr>')
.append(td(`!${item.id}`))
.append(td(item.desc))
.append(td(item.message))
.append(item.pictureurl ? td().append($('<img>').attr('src', item.pictureurl).attr('width', 96).attr('height', 96)) : td(''))
.append(td(item.enabled ? '✔️' : '❌'))
.append(td(item.hidden ? '❌' : '✔️'))
tbody.append(tr)
})
}
function load() {
$('#commands-table-body').empty()
$.get(`./command?sheetId=${$('#sheetId').val()}`, function(data) {
if (!data?.commands) return failed()
const commands = sortCommands(data.commands ?? [])
var cacheBody = $('#commands-table-body')
append(cacheBody, commands)
}).fail(failed)
}
$('#sheetId').on('change', load)
load()
})()
</script>
</html>
Open service 35.71.179.82:443 · ffbot.whitacre.dev
2025-12-30 10:59
HTTP/1.1 200 OK
Accept-Ranges: bytes
Cache-Control: no-cache
Content-Length: 3493
Content-Type: text/html; charset=utf-8
Date: Tue, 30 Dec 2025 10:59:23 GMT
Etag: "a28c32895caa141bed18dc2700ec2381f0ca3c64"
Last-Modified: Tue, 19 Sep 2023 01:54:06 GMT
Nel: {"report_to":"heroku-nel","response_headers":["Via"],"max_age":3600,"success_fraction":0.01,"failure_fraction":0.1}
Report-To: {"group":"heroku-nel","endpoints":[{"url":"https://nel.heroku.com/reports?s=cEqbYIr%2BoVTCuMVbldNfhcX4gFw35QZpHjTd81sIKJQ%3D\u0026sid=1b10b0ff-8a76-4548-befa-353fc6c6c045\u0026ts=1767092363"}],"max_age":3600}
Reporting-Endpoints: heroku-nel="https://nel.heroku.com/reports?s=cEqbYIr%2BoVTCuMVbldNfhcX4gFw35QZpHjTd81sIKJQ%3D&sid=1b10b0ff-8a76-4548-befa-353fc6c6c045&ts=1767092363"
Server: Heroku
Vary: accept-encoding
Via: 1.1 heroku-router
Connection: close
Page title: Fantasy Football Bot
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<title>Fantasy Football Bot</title>
<link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Roboto:300,300italic,700,700italic" />
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/normalize/3.0.3/normalize.css" />
<link rel="stylesheet" href="./styles/milligram.min.css" />
<link rel="stylesheet" href="./styles/main.css" />
</head>
<body>
<main class="wrapper">
<nav class="navigation">
<section class="container" id="navigation">
<h1 class="title">Fantasy Football Bot</h1>
</section>
</nav>
<section class="container" id="commands">
<h3>Commands</h3>
<select id="sheetId">
<option value="17X4gGMBjTqyXnIVtAiGOJ7tUdn5Uov2J2Ax6bNN7SvI">The Carrie 2023: Babygate</option>
<option value="10hFp2dc2_f8-sgnGRsRYCJtdLi95wtI_u_QPLcBaMIU">Playstation Group</option>
<option value="19pQBVOJmrbYlaHxMQnHKvTLBY0Ru8GLvD6r_VD3lF9c">fantasy-football-bot-dev (dev)</option>
<option value="defaults">fantasy-football-bot-dev (defaults)</option>
</select>
<table>
<thead>
<tr>
<th>Command</th>
<th>Description</th>
<th>Message</th>
<th>Picture</th>
<th title="Whether the bot responds to the command.">Enabled</th>
<th title="Shows in the !list command.">Visible</th>
</tr>
</thead>
<tbody id="commands-table-body"></tbody>
</table>
</section>
<section class="container" id="failed" style="display:none">
<p>
Sorry, the commands failed to load. Maybe refresh? ¯\_(ツ)_/¯
</p>
</section>
<footer class="footer">
<section class="container ">
<p>
Made with ♥ by Dan.
</p>
</section>
</footer>
</main>
</body>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.7.0/jquery.min.js"></script>
<script>
;(function() {
function failed() {
$('#commands').hide()
$('#failed').show()
}
function td(text) {
return $('<td>').text(text)
}
function sortCommands(array) {
return array
.sort((a, b) => a.id.localeCompare(b.id))
}
function append(tbody, array) {
var tbody = $(tbody)
array.forEach(function(item) {
var tr = $('<tr>')
.append(td(`!${item.id}`))
.append(td(item.desc))
.append(td(item.message))
.append(item.pictureurl ? td().append($('<img>').attr('src', item.pictureurl).attr('width', 96).attr('height', 96)) : td(''))
.append(td(item.enabled ? '✔️' : '❌'))
.append(td(item.hidden ? '❌' : '✔️'))
tbody.append(tr)
})
}
function load() {
$('#commands-table-body').empty()
$.get(`./command?sheetId=${$('#sheetId').val()}`, function(data) {
if (!data?.commands) return failed()
const commands = sortCommands(data.commands ?? [])
var cacheBody = $('#commands-table-body')
append(cacheBody, commands)
}).fail(failed)
}
$('#sheetId').on('change', load)
load()
})()
</script>
</html>
Open service 99.83.220.108:80 · ffbot.whitacre.dev
2025-12-30 09:01
HTTP/1.1 200 OK
Accept-Ranges: bytes
Cache-Control: no-cache
Content-Length: 3493
Content-Type: text/html; charset=utf-8
Date: Tue, 30 Dec 2025 09:01:20 GMT
Etag: "a28c32895caa141bed18dc2700ec2381f0ca3c64"
Last-Modified: Tue, 19 Sep 2023 01:54:06 GMT
Nel: {"report_to":"heroku-nel","response_headers":["Via"],"max_age":3600,"success_fraction":0.01,"failure_fraction":0.1}
Report-To: {"group":"heroku-nel","endpoints":[{"url":"https://nel.heroku.com/reports?s=M1JJXX8I%2B1zLsyUWM4wMveJpNl%2FvAricFQnK%2B6bMJfk%3D\u0026sid=1b10b0ff-8a76-4548-befa-353fc6c6c045\u0026ts=1767085280"}],"max_age":3600}
Reporting-Endpoints: heroku-nel="https://nel.heroku.com/reports?s=M1JJXX8I%2B1zLsyUWM4wMveJpNl%2FvAricFQnK%2B6bMJfk%3D&sid=1b10b0ff-8a76-4548-befa-353fc6c6c045&ts=1767085280"
Server: Heroku
Vary: accept-encoding
Via: 1.1 heroku-router
Connection: close
Page title: Fantasy Football Bot
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<title>Fantasy Football Bot</title>
<link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Roboto:300,300italic,700,700italic" />
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/normalize/3.0.3/normalize.css" />
<link rel="stylesheet" href="./styles/milligram.min.css" />
<link rel="stylesheet" href="./styles/main.css" />
</head>
<body>
<main class="wrapper">
<nav class="navigation">
<section class="container" id="navigation">
<h1 class="title">Fantasy Football Bot</h1>
</section>
</nav>
<section class="container" id="commands">
<h3>Commands</h3>
<select id="sheetId">
<option value="17X4gGMBjTqyXnIVtAiGOJ7tUdn5Uov2J2Ax6bNN7SvI">The Carrie 2023: Babygate</option>
<option value="10hFp2dc2_f8-sgnGRsRYCJtdLi95wtI_u_QPLcBaMIU">Playstation Group</option>
<option value="19pQBVOJmrbYlaHxMQnHKvTLBY0Ru8GLvD6r_VD3lF9c">fantasy-football-bot-dev (dev)</option>
<option value="defaults">fantasy-football-bot-dev (defaults)</option>
</select>
<table>
<thead>
<tr>
<th>Command</th>
<th>Description</th>
<th>Message</th>
<th>Picture</th>
<th title="Whether the bot responds to the command.">Enabled</th>
<th title="Shows in the !list command.">Visible</th>
</tr>
</thead>
<tbody id="commands-table-body"></tbody>
</table>
</section>
<section class="container" id="failed" style="display:none">
<p>
Sorry, the commands failed to load. Maybe refresh? ¯\_(ツ)_/¯
</p>
</section>
<footer class="footer">
<section class="container ">
<p>
Made with ♥ by Dan.
</p>
</section>
</footer>
</main>
</body>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.7.0/jquery.min.js"></script>
<script>
;(function() {
function failed() {
$('#commands').hide()
$('#failed').show()
}
function td(text) {
return $('<td>').text(text)
}
function sortCommands(array) {
return array
.sort((a, b) => a.id.localeCompare(b.id))
}
function append(tbody, array) {
var tbody = $(tbody)
array.forEach(function(item) {
var tr = $('<tr>')
.append(td(`!${item.id}`))
.append(td(item.desc))
.append(td(item.message))
.append(item.pictureurl ? td().append($('<img>').attr('src', item.pictureurl).attr('width', 96).attr('height', 96)) : td(''))
.append(td(item.enabled ? '✔️' : '❌'))
.append(td(item.hidden ? '❌' : '✔️'))
tbody.append(tr)
})
}
function load() {
$('#commands-table-body').empty()
$.get(`./command?sheetId=${$('#sheetId').val()}`, function(data) {
if (!data?.commands) return failed()
const commands = sortCommands(data.commands ?? [])
var cacheBody = $('#commands-table-body')
append(cacheBody, commands)
}).fail(failed)
}
$('#sheetId').on('change', load)
load()
})()
</script>
</html>
Open service 35.71.179.82:443 · ffbot.whitacre.dev
2025-12-23 07:10
HTTP/1.1 200 OK
Accept-Ranges: bytes
Cache-Control: no-cache
Content-Length: 3493
Content-Type: text/html; charset=utf-8
Date: Tue, 23 Dec 2025 07:10:24 GMT
Etag: "a28c32895caa141bed18dc2700ec2381f0ca3c64"
Last-Modified: Tue, 19 Sep 2023 01:54:06 GMT
Nel: {"report_to":"heroku-nel","response_headers":["Via"],"max_age":3600,"success_fraction":0.01,"failure_fraction":0.1}
Report-To: {"group":"heroku-nel","endpoints":[{"url":"https://nel.heroku.com/reports?s=bYJGCo8aNqSQsVhOh3g0B5DJYGo2XzqWUY9oQKfeSD8%3D\u0026sid=1b10b0ff-8a76-4548-befa-353fc6c6c045\u0026ts=1766473824"}],"max_age":3600}
Reporting-Endpoints: heroku-nel="https://nel.heroku.com/reports?s=bYJGCo8aNqSQsVhOh3g0B5DJYGo2XzqWUY9oQKfeSD8%3D&sid=1b10b0ff-8a76-4548-befa-353fc6c6c045&ts=1766473824"
Server: Heroku
Vary: accept-encoding
Via: 1.1 heroku-router
Connection: close
Page title: Fantasy Football Bot
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<title>Fantasy Football Bot</title>
<link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Roboto:300,300italic,700,700italic" />
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/normalize/3.0.3/normalize.css" />
<link rel="stylesheet" href="./styles/milligram.min.css" />
<link rel="stylesheet" href="./styles/main.css" />
</head>
<body>
<main class="wrapper">
<nav class="navigation">
<section class="container" id="navigation">
<h1 class="title">Fantasy Football Bot</h1>
</section>
</nav>
<section class="container" id="commands">
<h3>Commands</h3>
<select id="sheetId">
<option value="17X4gGMBjTqyXnIVtAiGOJ7tUdn5Uov2J2Ax6bNN7SvI">The Carrie 2023: Babygate</option>
<option value="10hFp2dc2_f8-sgnGRsRYCJtdLi95wtI_u_QPLcBaMIU">Playstation Group</option>
<option value="19pQBVOJmrbYlaHxMQnHKvTLBY0Ru8GLvD6r_VD3lF9c">fantasy-football-bot-dev (dev)</option>
<option value="defaults">fantasy-football-bot-dev (defaults)</option>
</select>
<table>
<thead>
<tr>
<th>Command</th>
<th>Description</th>
<th>Message</th>
<th>Picture</th>
<th title="Whether the bot responds to the command.">Enabled</th>
<th title="Shows in the !list command.">Visible</th>
</tr>
</thead>
<tbody id="commands-table-body"></tbody>
</table>
</section>
<section class="container" id="failed" style="display:none">
<p>
Sorry, the commands failed to load. Maybe refresh? ¯\_(ツ)_/¯
</p>
</section>
<footer class="footer">
<section class="container ">
<p>
Made with ♥ by Dan.
</p>
</section>
</footer>
</main>
</body>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.7.0/jquery.min.js"></script>
<script>
;(function() {
function failed() {
$('#commands').hide()
$('#failed').show()
}
function td(text) {
return $('<td>').text(text)
}
function sortCommands(array) {
return array
.sort((a, b) => a.id.localeCompare(b.id))
}
function append(tbody, array) {
var tbody = $(tbody)
array.forEach(function(item) {
var tr = $('<tr>')
.append(td(`!${item.id}`))
.append(td(item.desc))
.append(td(item.message))
.append(item.pictureurl ? td().append($('<img>').attr('src', item.pictureurl).attr('width', 96).attr('height', 96)) : td(''))
.append(td(item.enabled ? '✔️' : '❌'))
.append(td(item.hidden ? '❌' : '✔️'))
tbody.append(tr)
})
}
function load() {
$('#commands-table-body').empty()
$.get(`./command?sheetId=${$('#sheetId').val()}`, function(data) {
if (!data?.commands) return failed()
const commands = sortCommands(data.commands ?? [])
var cacheBody = $('#commands-table-body')
append(cacheBody, commands)
}).fail(failed)
}
$('#sheetId').on('change', load)
load()
})()
</script>
</html>
Open service 99.83.220.108:80 · ffbot.whitacre.dev
2025-12-22 12:10
HTTP/1.1 200 OK
Accept-Ranges: bytes
Cache-Control: no-cache
Content-Length: 3493
Content-Type: text/html; charset=utf-8
Date: Mon, 22 Dec 2025 12:10:19 GMT
Etag: "a28c32895caa141bed18dc2700ec2381f0ca3c64"
Last-Modified: Tue, 19 Sep 2023 01:54:06 GMT
Nel: {"report_to":"heroku-nel","response_headers":["Via"],"max_age":3600,"success_fraction":0.01,"failure_fraction":0.1}
Report-To: {"group":"heroku-nel","endpoints":[{"url":"https://nel.heroku.com/reports?s=PmGSB2wWvo86lk4lV4VmvafNrlokR1Di%2FSTntppZ7iw%3D\u0026sid=1b10b0ff-8a76-4548-befa-353fc6c6c045\u0026ts=1766405419"}],"max_age":3600}
Reporting-Endpoints: heroku-nel="https://nel.heroku.com/reports?s=PmGSB2wWvo86lk4lV4VmvafNrlokR1Di%2FSTntppZ7iw%3D&sid=1b10b0ff-8a76-4548-befa-353fc6c6c045&ts=1766405419"
Server: Heroku
Vary: accept-encoding
Via: 1.1 heroku-router
Connection: close
Page title: Fantasy Football Bot
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<title>Fantasy Football Bot</title>
<link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Roboto:300,300italic,700,700italic" />
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/normalize/3.0.3/normalize.css" />
<link rel="stylesheet" href="./styles/milligram.min.css" />
<link rel="stylesheet" href="./styles/main.css" />
</head>
<body>
<main class="wrapper">
<nav class="navigation">
<section class="container" id="navigation">
<h1 class="title">Fantasy Football Bot</h1>
</section>
</nav>
<section class="container" id="commands">
<h3>Commands</h3>
<select id="sheetId">
<option value="17X4gGMBjTqyXnIVtAiGOJ7tUdn5Uov2J2Ax6bNN7SvI">The Carrie 2023: Babygate</option>
<option value="10hFp2dc2_f8-sgnGRsRYCJtdLi95wtI_u_QPLcBaMIU">Playstation Group</option>
<option value="19pQBVOJmrbYlaHxMQnHKvTLBY0Ru8GLvD6r_VD3lF9c">fantasy-football-bot-dev (dev)</option>
<option value="defaults">fantasy-football-bot-dev (defaults)</option>
</select>
<table>
<thead>
<tr>
<th>Command</th>
<th>Description</th>
<th>Message</th>
<th>Picture</th>
<th title="Whether the bot responds to the command.">Enabled</th>
<th title="Shows in the !list command.">Visible</th>
</tr>
</thead>
<tbody id="commands-table-body"></tbody>
</table>
</section>
<section class="container" id="failed" style="display:none">
<p>
Sorry, the commands failed to load. Maybe refresh? ¯\_(ツ)_/¯
</p>
</section>
<footer class="footer">
<section class="container ">
<p>
Made with ♥ by Dan.
</p>
</section>
</footer>
</main>
</body>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.7.0/jquery.min.js"></script>
<script>
;(function() {
function failed() {
$('#commands').hide()
$('#failed').show()
}
function td(text) {
return $('<td>').text(text)
}
function sortCommands(array) {
return array
.sort((a, b) => a.id.localeCompare(b.id))
}
function append(tbody, array) {
var tbody = $(tbody)
array.forEach(function(item) {
var tr = $('<tr>')
.append(td(`!${item.id}`))
.append(td(item.desc))
.append(td(item.message))
.append(item.pictureurl ? td().append($('<img>').attr('src', item.pictureurl).attr('width', 96).attr('height', 96)) : td(''))
.append(td(item.enabled ? '✔️' : '❌'))
.append(td(item.hidden ? '❌' : '✔️'))
tbody.append(tr)
})
}
function load() {
$('#commands-table-body').empty()
$.get(`./command?sheetId=${$('#sheetId').val()}`, function(data) {
if (!data?.commands) return failed()
const commands = sortCommands(data.commands ?? [])
var cacheBody = $('#commands-table-body')
append(cacheBody, commands)
}).fail(failed)
}
$('#sheetId').on('change', load)
load()
})()
</script>
</html>
Open service 35.71.179.82:443 · ffbot.whitacre.dev
2025-12-21 06:02
HTTP/1.1 200 OK
Accept-Ranges: bytes
Cache-Control: no-cache
Content-Length: 3493
Content-Type: text/html; charset=utf-8
Date: Sun, 21 Dec 2025 06:02:49 GMT
Etag: "a28c32895caa141bed18dc2700ec2381f0ca3c64"
Last-Modified: Tue, 19 Sep 2023 01:54:06 GMT
Nel: {"report_to":"heroku-nel","response_headers":["Via"],"max_age":3600,"success_fraction":0.01,"failure_fraction":0.1}
Report-To: {"group":"heroku-nel","endpoints":[{"url":"https://nel.heroku.com/reports?s=wPpzuQCAAhK7nTCrt5kpKzAjldk8N3jyzOjEEDqqA30%3D\u0026sid=1b10b0ff-8a76-4548-befa-353fc6c6c045\u0026ts=1766296969"}],"max_age":3600}
Reporting-Endpoints: heroku-nel="https://nel.heroku.com/reports?s=wPpzuQCAAhK7nTCrt5kpKzAjldk8N3jyzOjEEDqqA30%3D&sid=1b10b0ff-8a76-4548-befa-353fc6c6c045&ts=1766296969"
Server: Heroku
Vary: accept-encoding
Via: 1.1 heroku-router
Connection: close
Page title: Fantasy Football Bot
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<title>Fantasy Football Bot</title>
<link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Roboto:300,300italic,700,700italic" />
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/normalize/3.0.3/normalize.css" />
<link rel="stylesheet" href="./styles/milligram.min.css" />
<link rel="stylesheet" href="./styles/main.css" />
</head>
<body>
<main class="wrapper">
<nav class="navigation">
<section class="container" id="navigation">
<h1 class="title">Fantasy Football Bot</h1>
</section>
</nav>
<section class="container" id="commands">
<h3>Commands</h3>
<select id="sheetId">
<option value="17X4gGMBjTqyXnIVtAiGOJ7tUdn5Uov2J2Ax6bNN7SvI">The Carrie 2023: Babygate</option>
<option value="10hFp2dc2_f8-sgnGRsRYCJtdLi95wtI_u_QPLcBaMIU">Playstation Group</option>
<option value="19pQBVOJmrbYlaHxMQnHKvTLBY0Ru8GLvD6r_VD3lF9c">fantasy-football-bot-dev (dev)</option>
<option value="defaults">fantasy-football-bot-dev (defaults)</option>
</select>
<table>
<thead>
<tr>
<th>Command</th>
<th>Description</th>
<th>Message</th>
<th>Picture</th>
<th title="Whether the bot responds to the command.">Enabled</th>
<th title="Shows in the !list command.">Visible</th>
</tr>
</thead>
<tbody id="commands-table-body"></tbody>
</table>
</section>
<section class="container" id="failed" style="display:none">
<p>
Sorry, the commands failed to load. Maybe refresh? ¯\_(ツ)_/¯
</p>
</section>
<footer class="footer">
<section class="container ">
<p>
Made with ♥ by Dan.
</p>
</section>
</footer>
</main>
</body>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.7.0/jquery.min.js"></script>
<script>
;(function() {
function failed() {
$('#commands').hide()
$('#failed').show()
}
function td(text) {
return $('<td>').text(text)
}
function sortCommands(array) {
return array
.sort((a, b) => a.id.localeCompare(b.id))
}
function append(tbody, array) {
var tbody = $(tbody)
array.forEach(function(item) {
var tr = $('<tr>')
.append(td(`!${item.id}`))
.append(td(item.desc))
.append(td(item.message))
.append(item.pictureurl ? td().append($('<img>').attr('src', item.pictureurl).attr('width', 96).attr('height', 96)) : td(''))
.append(td(item.enabled ? '✔️' : '❌'))
.append(td(item.hidden ? '❌' : '✔️'))
tbody.append(tr)
})
}
function load() {
$('#commands-table-body').empty()
$.get(`./command?sheetId=${$('#sheetId').val()}`, function(data) {
if (!data?.commands) return failed()
const commands = sortCommands(data.commands ?? [])
var cacheBody = $('#commands-table-body')
append(cacheBody, commands)
}).fail(failed)
}
$('#sheetId').on('change', load)
load()
})()
</script>
</html>
Open service 99.83.220.108:80 · ffbot.whitacre.dev
2025-12-20 11:42
HTTP/1.1 200 OK
Accept-Ranges: bytes
Cache-Control: no-cache
Content-Length: 3493
Content-Type: text/html; charset=utf-8
Date: Sat, 20 Dec 2025 11:42:38 GMT
Etag: "a28c32895caa141bed18dc2700ec2381f0ca3c64"
Last-Modified: Tue, 19 Sep 2023 01:54:06 GMT
Nel: {"report_to":"heroku-nel","response_headers":["Via"],"max_age":3600,"success_fraction":0.01,"failure_fraction":0.1}
Report-To: {"group":"heroku-nel","endpoints":[{"url":"https://nel.heroku.com/reports?s=MPKRYOuoMge0XdYTwolQbE%2B64DCztHxliXAgcNrLn9w%3D\u0026sid=1b10b0ff-8a76-4548-befa-353fc6c6c045\u0026ts=1766230958"}],"max_age":3600}
Reporting-Endpoints: heroku-nel="https://nel.heroku.com/reports?s=MPKRYOuoMge0XdYTwolQbE%2B64DCztHxliXAgcNrLn9w%3D&sid=1b10b0ff-8a76-4548-befa-353fc6c6c045&ts=1766230958"
Server: Heroku
Vary: accept-encoding
Via: 1.1 heroku-router
Connection: close
Page title: Fantasy Football Bot
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<title>Fantasy Football Bot</title>
<link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Roboto:300,300italic,700,700italic" />
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/normalize/3.0.3/normalize.css" />
<link rel="stylesheet" href="./styles/milligram.min.css" />
<link rel="stylesheet" href="./styles/main.css" />
</head>
<body>
<main class="wrapper">
<nav class="navigation">
<section class="container" id="navigation">
<h1 class="title">Fantasy Football Bot</h1>
</section>
</nav>
<section class="container" id="commands">
<h3>Commands</h3>
<select id="sheetId">
<option value="17X4gGMBjTqyXnIVtAiGOJ7tUdn5Uov2J2Ax6bNN7SvI">The Carrie 2023: Babygate</option>
<option value="10hFp2dc2_f8-sgnGRsRYCJtdLi95wtI_u_QPLcBaMIU">Playstation Group</option>
<option value="19pQBVOJmrbYlaHxMQnHKvTLBY0Ru8GLvD6r_VD3lF9c">fantasy-football-bot-dev (dev)</option>
<option value="defaults">fantasy-football-bot-dev (defaults)</option>
</select>
<table>
<thead>
<tr>
<th>Command</th>
<th>Description</th>
<th>Message</th>
<th>Picture</th>
<th title="Whether the bot responds to the command.">Enabled</th>
<th title="Shows in the !list command.">Visible</th>
</tr>
</thead>
<tbody id="commands-table-body"></tbody>
</table>
</section>
<section class="container" id="failed" style="display:none">
<p>
Sorry, the commands failed to load. Maybe refresh? ¯\_(ツ)_/¯
</p>
</section>
<footer class="footer">
<section class="container ">
<p>
Made with ♥ by Dan.
</p>
</section>
</footer>
</main>
</body>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.7.0/jquery.min.js"></script>
<script>
;(function() {
function failed() {
$('#commands').hide()
$('#failed').show()
}
function td(text) {
return $('<td>').text(text)
}
function sortCommands(array) {
return array
.sort((a, b) => a.id.localeCompare(b.id))
}
function append(tbody, array) {
var tbody = $(tbody)
array.forEach(function(item) {
var tr = $('<tr>')
.append(td(`!${item.id}`))
.append(td(item.desc))
.append(td(item.message))
.append(item.pictureurl ? td().append($('<img>').attr('src', item.pictureurl).attr('width', 96).attr('height', 96)) : td(''))
.append(td(item.enabled ? '✔️' : '❌'))
.append(td(item.hidden ? '❌' : '✔️'))
tbody.append(tr)
})
}
function load() {
$('#commands-table-body').empty()
$.get(`./command?sheetId=${$('#sheetId').val()}`, function(data) {
if (!data?.commands) return failed()
const commands = sortCommands(data.commands ?? [])
var cacheBody = $('#commands-table-body')
append(cacheBody, commands)
}).fail(failed)
}
$('#sheetId').on('change', load)
load()
})()
</script>
</html>
Open service 35.71.179.82:443 · ffbot.whitacre.dev
2025-12-19 03:29
HTTP/1.1 200 OK
Accept-Ranges: bytes
Cache-Control: no-cache
Content-Length: 3493
Content-Type: text/html; charset=utf-8
Date: Fri, 19 Dec 2025 03:29:30 GMT
Etag: "a28c32895caa141bed18dc2700ec2381f0ca3c64"
Last-Modified: Tue, 19 Sep 2023 01:54:06 GMT
Nel: {"report_to":"heroku-nel","response_headers":["Via"],"max_age":3600,"success_fraction":0.01,"failure_fraction":0.1}
Report-To: {"group":"heroku-nel","endpoints":[{"url":"https://nel.heroku.com/reports?s=4E2qndklLdI67r7aDNVLEf7Do34PG7vqZDBzZJu2oM4%3D\u0026sid=1b10b0ff-8a76-4548-befa-353fc6c6c045\u0026ts=1766114970"}],"max_age":3600}
Reporting-Endpoints: heroku-nel="https://nel.heroku.com/reports?s=4E2qndklLdI67r7aDNVLEf7Do34PG7vqZDBzZJu2oM4%3D&sid=1b10b0ff-8a76-4548-befa-353fc6c6c045&ts=1766114970"
Server: Heroku
Vary: accept-encoding
Via: 1.1 heroku-router
Connection: close
Page title: Fantasy Football Bot
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<title>Fantasy Football Bot</title>
<link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Roboto:300,300italic,700,700italic" />
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/normalize/3.0.3/normalize.css" />
<link rel="stylesheet" href="./styles/milligram.min.css" />
<link rel="stylesheet" href="./styles/main.css" />
</head>
<body>
<main class="wrapper">
<nav class="navigation">
<section class="container" id="navigation">
<h1 class="title">Fantasy Football Bot</h1>
</section>
</nav>
<section class="container" id="commands">
<h3>Commands</h3>
<select id="sheetId">
<option value="17X4gGMBjTqyXnIVtAiGOJ7tUdn5Uov2J2Ax6bNN7SvI">The Carrie 2023: Babygate</option>
<option value="10hFp2dc2_f8-sgnGRsRYCJtdLi95wtI_u_QPLcBaMIU">Playstation Group</option>
<option value="19pQBVOJmrbYlaHxMQnHKvTLBY0Ru8GLvD6r_VD3lF9c">fantasy-football-bot-dev (dev)</option>
<option value="defaults">fantasy-football-bot-dev (defaults)</option>
</select>
<table>
<thead>
<tr>
<th>Command</th>
<th>Description</th>
<th>Message</th>
<th>Picture</th>
<th title="Whether the bot responds to the command.">Enabled</th>
<th title="Shows in the !list command.">Visible</th>
</tr>
</thead>
<tbody id="commands-table-body"></tbody>
</table>
</section>
<section class="container" id="failed" style="display:none">
<p>
Sorry, the commands failed to load. Maybe refresh? ¯\_(ツ)_/¯
</p>
</section>
<footer class="footer">
<section class="container ">
<p>
Made with ♥ by Dan.
</p>
</section>
</footer>
</main>
</body>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.7.0/jquery.min.js"></script>
<script>
;(function() {
function failed() {
$('#commands').hide()
$('#failed').show()
}
function td(text) {
return $('<td>').text(text)
}
function sortCommands(array) {
return array
.sort((a, b) => a.id.localeCompare(b.id))
}
function append(tbody, array) {
var tbody = $(tbody)
array.forEach(function(item) {
var tr = $('<tr>')
.append(td(`!${item.id}`))
.append(td(item.desc))
.append(td(item.message))
.append(item.pictureurl ? td().append($('<img>').attr('src', item.pictureurl).attr('width', 96).attr('height', 96)) : td(''))
.append(td(item.enabled ? '✔️' : '❌'))
.append(td(item.hidden ? '❌' : '✔️'))
tbody.append(tr)
})
}
function load() {
$('#commands-table-body').empty()
$.get(`./command?sheetId=${$('#sheetId').val()}`, function(data) {
if (!data?.commands) return failed()
const commands = sortCommands(data.commands ?? [])
var cacheBody = $('#commands-table-body')
append(cacheBody, commands)
}).fail(failed)
}
$('#sheetId').on('change', load)
load()
})()
</script>
</html>