0.1.0 initial commit
This commit is contained in:
commit
6b88aff1e7
14 changed files with 1559 additions and 0 deletions
49
src/bot.ts
Normal file
49
src/bot.ts
Normal file
|
|
@ -0,0 +1,49 @@
|
|||
/*
|
||||
Copyright 2025 Sakuragasaki46
|
||||
|
||||
Licensed under the Apache License, Version 2.0 (the "License");
|
||||
you may not use this file except in compliance with the License.
|
||||
You may obtain a copy of the License at
|
||||
|
||||
http://www.apache.org/licenses/LICENSE-2.0
|
||||
|
||||
Unless required by applicable law or agreed to in writing, software
|
||||
distributed under the License is distributed on an "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
See the License for the specific language governing permissions and
|
||||
limitations under the License.
|
||||
*/
|
||||
|
||||
import { config as configDotenv } from 'dotenv';
|
||||
configDotenv();
|
||||
|
||||
import { GatewayIntentBits, Events, Interaction, ChatInputCommandInteraction } from 'discord.js';
|
||||
import { MyClient } from './client';
|
||||
import commandList from './commandList';
|
||||
|
||||
const client = new MyClient({
|
||||
intents: [
|
||||
GatewayIntentBits.Guilds
|
||||
]
|
||||
});
|
||||
|
||||
for (let command of commandList) {
|
||||
client.addCommand(command);
|
||||
}
|
||||
|
||||
client.on(Events.InteractionCreate, async (interaction: Interaction) => {
|
||||
if (interaction instanceof ChatInputCommandInteraction) {
|
||||
let command = client.commands.get(interaction.commandName);
|
||||
try {
|
||||
await command.execute(interaction);
|
||||
} catch (ex) {
|
||||
console.error(ex);
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
client.once(Events.ClientReady, async () => {
|
||||
console.log(`Logged in as \x1b[1m${client.user.tag}\x1b[22m`);
|
||||
})
|
||||
|
||||
client.login(process.env.TOKEN);
|
||||
32
src/client.ts
Normal file
32
src/client.ts
Normal file
|
|
@ -0,0 +1,32 @@
|
|||
/*
|
||||
Copyright 2025 Sakuragasaki46
|
||||
|
||||
Licensed under the Apache License, Version 2.0 (the "License");
|
||||
you may not use this file except in compliance with the License.
|
||||
You may obtain a copy of the License at
|
||||
|
||||
http://www.apache.org/licenses/LICENSE-2.0
|
||||
|
||||
Unless required by applicable law or agreed to in writing, software
|
||||
distributed under the License is distributed on an "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
See the License for the specific language governing permissions and
|
||||
limitations under the License.
|
||||
*/
|
||||
|
||||
import { Client, ClientOptions, Collection, SlashCommandOptionsOnlyBuilder } from 'discord.js';
|
||||
|
||||
type CommandInfo = {data: SlashCommandOptionsOnlyBuilder, execute: Function};
|
||||
|
||||
export class MyClient extends Client {
|
||||
commands: Collection<string, CommandInfo>;
|
||||
|
||||
constructor (opts: ClientOptions) {
|
||||
super(opts);
|
||||
this.commands = new Collection();
|
||||
}
|
||||
|
||||
addCommand (command: CommandInfo) {
|
||||
this.commands.set(command.data.name, command);
|
||||
}
|
||||
}
|
||||
25
src/commandList.ts
Normal file
25
src/commandList.ts
Normal file
|
|
@ -0,0 +1,25 @@
|
|||
/*
|
||||
Copyright 2025 Sakuragasaki46
|
||||
|
||||
Licensed under the Apache License, Version 2.0 (the "License");
|
||||
you may not use this file except in compliance with the License.
|
||||
You may obtain a copy of the License at
|
||||
|
||||
http://www.apache.org/licenses/LICENSE-2.0
|
||||
|
||||
Unless required by applicable law or agreed to in writing, software
|
||||
distributed under the License is distributed on an "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
See the License for the specific language governing permissions and
|
||||
limitations under the License.
|
||||
*/
|
||||
|
||||
import { SlashCommandOptionsOnlyBuilder } from 'discord.js';
|
||||
import yroo from './commands/yroo';
|
||||
|
||||
const commandList = [
|
||||
yroo
|
||||
];
|
||||
|
||||
export default commandList;
|
||||
|
||||
50
src/commands/wiki.ts
Normal file
50
src/commands/wiki.ts
Normal file
|
|
@ -0,0 +1,50 @@
|
|||
import { ChatInputCommandInteraction, EmbedBuilder, SlashCommandBuilder } from "discord.js";
|
||||
import { MediaWikiClient } from '../mediawiki';
|
||||
|
||||
const pageSources = {
|
||||
'cittadeldank': {
|
||||
url: 'https://wiki.cittadeldank.it',
|
||||
name: 'Città del Dank'
|
||||
}
|
||||
}
|
||||
|
||||
const pageSourcesAuto = [
|
||||
'cittadeldank'
|
||||
];
|
||||
|
||||
const data = new SlashCommandBuilder()
|
||||
.setName('wiki')
|
||||
.setDescription('Mostra la pagina wiki di un argomento')
|
||||
.addStringOption(o => o.setName('p')
|
||||
.setDescription('Il nome della pagina')
|
||||
.setRequired(true)
|
||||
)
|
||||
.addStringOption(o => o.setName('source')
|
||||
.setDescription('Dove guardare')
|
||||
.addChoices([
|
||||
{name: 'Città del Dank', value: 'cittadeldank'},
|
||||
{name: 'Automatico', value: 'auto'}
|
||||
])
|
||||
.setRequired(false)
|
||||
);
|
||||
|
||||
async function execute (interaction: ChatInputCommandInteraction) {
|
||||
await interaction.deferReply();
|
||||
|
||||
const siteChoice = interaction.options.getString('source') ?? 'auto';
|
||||
const { name: siteName, url: siteUrl } = pageSources[siteChoice];
|
||||
const mwClient = new MediaWikiClient(siteUrl);
|
||||
const pageData = await mwClient.getPage(interaction.options.getString('p'));
|
||||
|
||||
const pageEmbed = new EmbedBuilder()
|
||||
.setTitle(pageData.title)
|
||||
.setURL(pageData.url)
|
||||
.setDescription(pageData.content)
|
||||
.setFooter({
|
||||
text: `Informazioni da ${siteName}`
|
||||
});
|
||||
|
||||
await interaction.followUp({
|
||||
embeds: [pageEmbed]
|
||||
});
|
||||
}
|
||||
46
src/commands/yroo.ts
Normal file
46
src/commands/yroo.ts
Normal file
|
|
@ -0,0 +1,46 @@
|
|||
/*
|
||||
Copyright 2025 Sakuragasaki46
|
||||
|
||||
Licensed under the Apache License, Version 2.0 (the "License");
|
||||
you may not use this file except in compliance with the License.
|
||||
You may obtain a copy of the License at
|
||||
|
||||
http://www.apache.org/licenses/LICENSE-2.0
|
||||
|
||||
Unless required by applicable law or agreed to in writing, software
|
||||
distributed under the License is distributed on an "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
See the License for the specific language governing permissions and
|
||||
limitations under the License.
|
||||
*/
|
||||
|
||||
import { ChatInputCommandInteraction, SlashCommandBuilder } from 'discord.js';
|
||||
|
||||
function yroo (msg: string): string {
|
||||
const enc: string[] = [];
|
||||
for (let i = 0; i < msg.length; i++) {
|
||||
if (/[A-Z]/.test(msg[i])) enc.push(String.fromCharCode(155 - msg.charCodeAt(i)));
|
||||
else if (/[a-z]/.test(msg[i])) enc.push(String.fromCharCode(219 - msg.charCodeAt(i)));
|
||||
else enc.push(msg[i]);
|
||||
}
|
||||
return enc.join('');
|
||||
}
|
||||
|
||||
const data = new SlashCommandBuilder()
|
||||
.setName('yroo')
|
||||
.setDescription('IL TRIANGOLO NO!!!1!')
|
||||
.addStringOption(o => o.setName('msg')
|
||||
.setDescription('Non l\'avevo considerato.')
|
||||
.setRequired(true)
|
||||
);
|
||||
|
||||
async function execute(interaction: ChatInputCommandInteraction){
|
||||
await interaction.deferReply();
|
||||
|
||||
const origMsg = interaction.options.getString('msg') ?? '';
|
||||
const encMsg = yroo(origMsg);
|
||||
|
||||
await interaction.followUp({ content: encMsg })
|
||||
}
|
||||
|
||||
export default { data, execute };
|
||||
26
src/mediawiki.ts
Normal file
26
src/mediawiki.ts
Normal file
|
|
@ -0,0 +1,26 @@
|
|||
|
||||
import wiki from 'wikijs';
|
||||
|
||||
export class MediaWikiClient {
|
||||
apiUrl: string
|
||||
|
||||
constructor (url: string){
|
||||
this.apiUrl = url.endsWith('api.php') ? url : url + '/w/api.php';
|
||||
}
|
||||
|
||||
async getPage(title: string) {
|
||||
const page = await wiki({
|
||||
apiUrl: this.apiUrl,
|
||||
origin: null
|
||||
}).page(title);
|
||||
|
||||
const pageUrl = page.url();
|
||||
const content = await page.content();
|
||||
|
||||
return {
|
||||
url: pageUrl,
|
||||
title,
|
||||
content: content.length > 4000? content.slice(0, 3999) + '\u2026': content
|
||||
}
|
||||
}
|
||||
}
|
||||
37
src/register.ts
Normal file
37
src/register.ts
Normal file
|
|
@ -0,0 +1,37 @@
|
|||
|
||||
import { config as configDotenv } from 'dotenv';
|
||||
configDotenv();
|
||||
|
||||
import commandList from "./commandList";
|
||||
import { REST, Routes } from 'discord.js';
|
||||
|
||||
function registerGlobal(rest: REST, clientId: string, commands: any){
|
||||
rest.put(Routes.applicationCommands(clientId), { body: commands })
|
||||
.then(() => { console.log(`Successfully registered ${commands.length} / commands globally. Please wait until 2 hours before they are updated`); })
|
||||
.catch(console.error);
|
||||
}
|
||||
|
||||
function registerLocal(rest: REST, clientId: string, commands: any, guilds: string[]){
|
||||
for (const guildId of guilds) {
|
||||
rest.put(Routes.applicationGuildCommands(clientId, guildId), { body: commands })
|
||||
.then(() => { console.log(`Successfully registered ${commands.length} / commands in guild ${guildId}`); })
|
||||
.catch(console.error);
|
||||
}
|
||||
}
|
||||
|
||||
const clientId = process.env.CLIENT_ID;
|
||||
|
||||
const commands = [];
|
||||
for (let command of commandList) {
|
||||
commands.push(command.data.toJSON());
|
||||
}
|
||||
|
||||
const guilds = process.env.GUILD_IDS.trim().split(/[\s,;]+/);
|
||||
|
||||
const rest = new REST({ version: '10' }).setToken(process.env.TOKEN);
|
||||
|
||||
if (guilds.length === 0){
|
||||
registerGlobal(rest, clientId, commands);
|
||||
} else {
|
||||
registerLocal(rest, clientId, commands, guilds);
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue