add api for getting statistics
This commit is contained in:
		
							parent
							
								
									57cae9c01f
								
							
						
					
					
						commit
						0006e66b16
					
				| 
						 | 
					@ -0,0 +1,11 @@
 | 
				
			||||||
 | 
					meta {
 | 
				
			||||||
 | 
					  name: Bot Statistics
 | 
				
			||||||
 | 
					  type: http
 | 
				
			||||||
 | 
					  seq: 2
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					get {
 | 
				
			||||||
 | 
					  url: http://localhost:8166/api/stats
 | 
				
			||||||
 | 
					  body: none
 | 
				
			||||||
 | 
					  auth: inherit
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
| 
						 | 
					@ -102,6 +102,9 @@ const start = () => {
 | 
				
			||||||
                case '/ping':
 | 
					                case '/ping':
 | 
				
			||||||
                case '/ping/':
 | 
					                case '/ping/':
 | 
				
			||||||
                  return endpoints.get.apiPing();
 | 
					                  return endpoints.get.apiPing();
 | 
				
			||||||
 | 
					                case '/stats':
 | 
				
			||||||
 | 
					                case '/stats/':
 | 
				
			||||||
 | 
					                  return endpoints.get.apiStats();
 | 
				
			||||||
                case '/key':
 | 
					                case '/key':
 | 
				
			||||||
                case '/key/':
 | 
					                case '/key/':
 | 
				
			||||||
                  return endpoints.get.apiKeyAdmin(query, apiUserid);
 | 
					                  return endpoints.get.apiKeyAdmin(query, apiUserid);
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -5,6 +5,7 @@ import { apiKey } from 'endpoints/gets/apiKey.ts';
 | 
				
			||||||
import { apiKeyAdmin } from 'endpoints/gets/apiKeyAdmin.ts';
 | 
					import { apiKeyAdmin } from 'endpoints/gets/apiKeyAdmin.ts';
 | 
				
			||||||
import { apiPing } from 'endpoints/gets/apiPing.ts';
 | 
					import { apiPing } from 'endpoints/gets/apiPing.ts';
 | 
				
			||||||
import { apiRoll } from 'endpoints/gets/apiRoll.ts';
 | 
					import { apiRoll } from 'endpoints/gets/apiRoll.ts';
 | 
				
			||||||
 | 
					import { apiStats } from 'endpoints/gets/apiStats.ts';
 | 
				
			||||||
import { generateWebView } from 'endpoints/gets/webView.ts';
 | 
					import { generateWebView } from 'endpoints/gets/webView.ts';
 | 
				
			||||||
import { heatmapPng } from 'endpoints/gets/heatmapPng.ts';
 | 
					import { heatmapPng } from 'endpoints/gets/heatmapPng.ts';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -24,6 +25,7 @@ export default {
 | 
				
			||||||
    apiKeyAdmin,
 | 
					    apiKeyAdmin,
 | 
				
			||||||
    apiPing,
 | 
					    apiPing,
 | 
				
			||||||
    apiRoll,
 | 
					    apiRoll,
 | 
				
			||||||
 | 
					    apiStats,
 | 
				
			||||||
    generateWebView,
 | 
					    generateWebView,
 | 
				
			||||||
    heatmapPng,
 | 
					    heatmapPng,
 | 
				
			||||||
  },
 | 
					  },
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -0,0 +1,44 @@
 | 
				
			||||||
 | 
					import { cache, cacheHandlers } from '@discordeno';
 | 
				
			||||||
 | 
					import { STATUS_CODE, STATUS_TEXT } from '@std/http/status';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import { basicReducer } from 'artigen/utils/reducers.ts';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import dbClient from 'db/client.ts';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import stdResponses from 'endpoints/stdResponses.ts';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import utils from 'utils/utils.ts';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					export const apiStats = async (): Promise<Response> => {
 | 
				
			||||||
 | 
					  const headers = new Headers();
 | 
				
			||||||
 | 
					  headers.append('Content-Type', 'text/json');
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  const memberCount = cache.guilds
 | 
				
			||||||
 | 
					    .array()
 | 
				
			||||||
 | 
					    .map((guild) => guild.memberCount)
 | 
				
			||||||
 | 
					    .reduce(basicReducer);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  const cachedGuilds = await cacheHandlers.size('guilds');
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  const rollQuery = await dbClient
 | 
				
			||||||
 | 
					    .query(`SELECT count, hourlyRate FROM command_cnt WHERE command = "roll";`)
 | 
				
			||||||
 | 
					    .catch((e) => utils.commonLoggers.dbError('stats.ts:23', 'query', e));
 | 
				
			||||||
 | 
					  const rollCount = BigInt(rollQuery[0].count ?? '0');
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  if (!rollCount) {
 | 
				
			||||||
 | 
					    return stdResponses.InternalServerError('');
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  return new Response(
 | 
				
			||||||
 | 
					    JSON.stringify({
 | 
				
			||||||
 | 
					      guildCount: cachedGuilds + cache.dispatchedGuildIds.size,
 | 
				
			||||||
 | 
					      memberCount,
 | 
				
			||||||
 | 
					      rollCount,
 | 
				
			||||||
 | 
					    }),
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					      status: STATUS_CODE.OK,
 | 
				
			||||||
 | 
					      statusText: STATUS_TEXT[STATUS_CODE.OK],
 | 
				
			||||||
 | 
					      headers,
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					  );
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
		Loading…
	
		Reference in New Issue