You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
discordbot.js/web/http/scripts/query.js

314 lines
12 KiB
JavaScript

let latestLogs = [];
let status = {
0: 'ready',
1: 'connecting',
2: 'reconnecting',
3: 'idle',
4: 'nearly',
5: 'disconnected'
};
function getSplitDuration (duration) {
let dur = duration;
let retObj = {};
retObj.milliseconds = dur % 1000;
dur = Math.floor(dur / 1000);
retObj.seconds = dur % 60;
dur = Math.floor(dur / 60);
retObj.minutes = dur % 60;
dur = Math.floor(dur / 60);
retObj.hours = dur % 24;
dur = Math.floor(dur / 24);
retObj.days = dur;
return retObj;
}
function postQuery(query) {
return new Promise((resolve) => {
$.post({
url: "/graphql",
headers: {
Authorization: `Bearer ${localStorage.apiToken}`
},
data: JSON.stringify({
query: query
}),
contentType: "application/json"
}).done((res) => resolve(res));
});
}
function queryStatic() {
let query = `{
client {
user {
tag
avatar
}
}
}`;
postQuery(query).then((res) => {
let d = res.data;
document.querySelector('#user-avatar').setAttribute('src', d.client.user.avatar);
document.querySelector('#user-tag').innerText = d.client.user.tag;
});
}
function queryGuilds() {
let query = `{
client {
guilds {
id
name
dj {
playing
}
}
}
}`;
postQuery(query).then((res) => {
for (let guild of res.data.client.guilds)
if ($(`option[value=${guild.id}]`).length === 0) {
let option = document.createElement('option');
option.setAttribute('value', guild.id);
if (guild.dj)
option.innerText = guild.dj.playing? guild.name + ' 🎶' : guild.name;
let guildSelect = document.querySelector('#guild-select');
guildSelect.appendChild(option);
}
});
}
function queryGuild(guildId) {
let query = `{
client {
guilds(id: "${guildId}") {
name
icon
memberCount
owner {
id
user {
tag
}
}
}
}
config
}`;
postQuery(query).then((res) => {
let guild = res.data.client.guilds[0];
document.querySelector('#guild-icon').setAttribute('src', guild.icon);
document.querySelector('#guild-name').innerText = guild.name;
document.querySelector('#guild-owner').innerText = guild.owner.user.tag;
document.querySelector('#guild-owner').setAttribute('owner-id', guild.owner.id);
document.querySelector('#guild-memberCount').innerText = guild.memberCount;
queryGuildStatus(guildId);
let serverinfo = $('#guildinfo');
if (serverinfo.is(':hidden'))
serverinfo.show();
});
}
/**
* TODO: Play/Pause as status
* @param guildId
*/
function queryGuildStatus(guildId) {
let query = `{
client {
guilds(id: "${guildId}") {
dj {
playing
connected
repeat
voiceChannel
songStartTime
paused
currentSong {
name
url
thumbnail
}
queueCount
queue(first: 5) {
id
name
url
thumbnail
}
}
}
}
config
}`;
postQuery(query).then((res) => {
let guild = res.data.client.guilds[0];
document.querySelector('#dj-repeat').innerText = guild.dj.repeat? 'on': 'off';
document.querySelector('#guild-djStatus').innerText = guild.dj.connected? 'connected' : 'disconnected';
if (guild.dj.connected) {
let songinfoContainer = $('#dj-songinfo');
songinfoContainer.show();
document.querySelector('#guild-djStatus').innerText = guild.dj.playing? 'playing' : 'connected';
document.querySelector('#dj-voiceChannel').innerText = guild.dj.voiceChannel;
if (guild.dj.playing) {
if (songinfoContainer.is(':hidden'))
songinfoContainer.show();
document.querySelector('#guild-djStatus').innerText = guild.dj.paused? 'paused' : 'playing';
document.querySelector('#songinfo-container').setAttribute('href', guild.dj.currentSong.url);
document.querySelector('#dj-songname').innerText = guild.dj.currentSong.name;
document.querySelector('#dj-songImg').setAttribute('src', guild.dj.currentSong.thumbnail.replace('maxresdefault', 'mqdefault'));
let songSd = getSplitDuration(Date.now() - guild.dj.songStartTime);
document.querySelector('#dj-songCurrentTS').innerText = `${songSd.minutes}:${songSd.seconds.toString().padStart(2, '0')}`;
document.querySelector('#dj-songCurrentTS').setAttribute('start-ts', guild.dj.songStartTime);
document.querySelector('#dj-queueCount').innerText = guild.dj.queueCount;
let songContainer = document.querySelector('#dj-songQueue');
$('.songEntry').remove();
for (let song of guild.dj.queue) {
let songEntry = document.createElement('a');
songEntry.setAttribute('href', song.url);
songEntry.setAttribute('class', 'songEntry');
songEntry.setAttribute('song-id', song.id);
let imageEntry = document.createElement('img');
imageEntry.setAttribute('src', song.thumbnail.replace('maxresdefault', 'mqdefault'));
songEntry.appendChild(imageEntry);
let nameEntry = document.createElement('a');
nameEntry.innerText = song.name;
songEntry.appendChild(nameEntry);
songContainer.appendChild(songEntry);
}
document.querySelector('#dj-queueDisplayCount').innerText = document.querySelectorAll('.songEntry').length;
} else {
if (songinfoContainer.is(':not(:hidden)'))
songinfoContainer.hide();
}
} else {
$('#dj-songinfo').hide();
document.querySelector('#dj-voiceChannel').innerText = 'None';
}
});
}
function queryStatus() {
let query = `{
client {
ping
status
uptime
guildCount
voiceConnectionCount
user {
presence {
game
status
}
}
}
}`;
postQuery(query).then((res) => {
let d = res.data;
document.querySelector('#client-ping').innerText = Math.round(d.client.ping * 10)/10 + ' ms';
document.querySelector('#client-status').innerText = status[d.client.status];
let sd = getSplitDuration(d.client.uptime);
document.querySelector('#client-uptime')
.innerText = `${sd.days}d ${sd.hours}h ${sd.minutes}min ${sd.seconds}s`;
document.querySelector('#client-guildCount').innerText = d.client.guildCount;
document.querySelector('#client-vcCount').innerText = d.client.voiceConnectionCount;
if (d.client.status !== 0)
document.querySelector('#status-indicator').setAttribute('status', 'offline');
else
document.querySelector('#status-indicator').setAttribute('status', d.client.user.presence.status);
document.querySelector('#user-game').innerText = d.client.user.presence.game;
setTimeout(() => {
let sd = getSplitDuration(d.client.uptime + 1000);
document.querySelector('#client-uptime')
.innerText = `${sd.days}d ${sd.hours}h ${sd.minutes}min ${sd.seconds}s`;
}, 1000);
});
}
function queryLogs(count) {
count = count || 5;
let query = `{
logs(last: ${count}, level: "verbose"){
id
level
message
timestamp
}
}`;
postQuery(query).then((res) => {
let d = res.data;
for (let logEntry of d.logs)
if (!latestLogs.find((x) => x.id === logEntry.id)) {
let entryElem = document.createElement('div');
entryElem.setAttribute('class', 'logEntry text-left');
entryElem.setAttribute('log-id', logEntry.id);
entryElem.setAttribute('level', logEntry.level);
let infoDiv = document.createElement('div');
infoDiv.setAttribute('class', 'infodiv');
let lvlSpan = document.createElement('span');
lvlSpan.innerText = logEntry.level;
lvlSpan.setAttribute('class', 'text-left');
infoDiv.appendChild(lvlSpan);
let tsSpan = document.createElement('span');
tsSpan.setAttribute('timestamp', logEntry.timestamp);
tsSpan.innerText = moment(logEntry.timestamp, 'YY-MM-DD-HH-mm-ss').format('MMM Do HH:mm:ss');
tsSpan.setAttribute('class', 'text-right');
infoDiv.appendChild(tsSpan);
entryElem.appendChild(infoDiv);
let msgSpan = document.createElement('span');
msgSpan.innerText = logEntry.message;
msgSpan.setAttribute('class', 'message');
entryElem.appendChild(msgSpan);
let logContainer = document.querySelector('#log-container');
logContainer.insertBefore(entryElem, logContainer.firstChild);
}
latestLogs = d.logs;
});
}
function startUpdating() {
if (!localStorage.apiToken || localStorage.apiToken.length < 0)
localStorage.apiToken = prompt('Please provide an api token: ');
queryStatic();
setInterval(queryStatic, 3600000);
queryStatus();
setInterval(queryStatus, 2000);
queryLogs(50);
setInterval(queryLogs, 5000);
queryGuilds();
setInterval(queryGuilds, 60000);
setInterval(() => {
let gid = $('#guild-select')[0].value;
if (gid && gid !== 'select-default')
queryGuildStatus(gid);
}, 5000);
setInterval(() => {
let gid = $('#guild-select')[0].value;
if (gid && gid !== 'select-default')
queryGuild(gid);
}, 600000);
$('#guild-select').on('change', (ev) => {
let fch = document.querySelector('#guild-select').firstElementChild;
if (fch.getAttribute('value') === 'select-default')
fch.remove();
let guildId = ev.target.value;
queryGuild(guildId);
});
setInterval(() => {
let songSd = getSplitDuration(Date.now() - $('#dj-songCurrentTS').attr('start-ts'));
document.querySelector('#dj-songCurrentTS').innerText = `${songSd.minutes}:${songSd.seconds.toString().padStart(2, '0')}`;
}, 500);
}