diff --git a/CODE_OF_CONDUCT.md b/CODE_OF_CONDUCT.md deleted file mode 100644 index f0b55ae..0000000 --- a/CODE_OF_CONDUCT.md +++ /dev/null @@ -1,128 +0,0 @@ -# Contributor Covenant Code of Conduct - -## Our Pledge - -We as members, contributors, and leaders pledge to make participation in our -community a harassment-free experience for everyone, regardless of age, body -size, visible or invisible disability, ethnicity, sex characteristics, gender -identity and expression, level of experience, education, socio-economic status, -nationality, personal appearance, race, religion, or sexual identity -and orientation. - -We pledge to act and interact in ways that contribute to an open, welcoming, -diverse, inclusive, and healthy community. - -## Our Standards - -Examples of behavior that contributes to a positive environment for our -community include: - -* Demonstrating empathy and kindness toward other people -* Being respectful of differing opinions, viewpoints, and experiences -* Giving and gracefully accepting constructive feedback -* Accepting responsibility and apologizing to those affected by our mistakes, - and learning from the experience -* Focusing on what is best not just for us as individuals, but for the - overall community - -Examples of unacceptable behavior include: - -* The use of sexualized language or imagery, and sexual attention or - advances of any kind -* Trolling, insulting or derogatory comments, and personal or political attacks -* Public or private harassment -* Publishing others' private information, such as a physical or email - address, without their explicit permission -* Other conduct which could reasonably be considered inappropriate in a - professional setting - -## Enforcement Responsibilities - -Community leaders are responsible for clarifying and enforcing our standards of -acceptable behavior and will take appropriate and fair corrective action in -response to any behavior that they deem inappropriate, threatening, offensive, -or harmful. - -Community leaders have the right and responsibility to remove, edit, or reject -comments, commits, code, wiki edits, issues, and other contributions that are -not aligned to this Code of Conduct, and will communicate reasons for moderation -decisions when appropriate. - -## Scope - -This Code of Conduct applies within all community spaces, and also applies when -an individual is officially representing the community in public spaces. -Examples of representing our community include using an official e-mail address, -posting via an official social media account, or acting as an appointed -representative at an online or offline event. - -## Enforcement - -Instances of abusive, harassing, or otherwise unacceptable behavior may be -reported to the community leaders responsible for enforcement at -https://discord.gg/bPaNnxe. -All complaints will be reviewed and investigated promptly and fairly. - -All community leaders are obligated to respect the privacy and security of the -reporter of any incident. - -## Enforcement Guidelines - -Community leaders will follow these Community Impact Guidelines in determining -the consequences for any action they deem in violation of this Code of Conduct: - -### 1. Correction - -**Community Impact**: Use of inappropriate language or other behavior deemed -unprofessional or unwelcome in the community. - -**Consequence**: A private, written warning from community leaders, providing -clarity around the nature of the violation and an explanation of why the -behavior was inappropriate. A public apology may be requested. - -### 2. Warning - -**Community Impact**: A violation through a single incident or series -of actions. - -**Consequence**: A warning with consequences for continued behavior. No -interaction with the people involved, including unsolicited interaction with -those enforcing the Code of Conduct, for a specified period of time. This -includes avoiding interactions in community spaces as well as external channels -like social media. Violating these terms may lead to a temporary or -permanent ban. - -### 3. Temporary Ban - -**Community Impact**: A serious violation of community standards, including -sustained inappropriate behavior. - -**Consequence**: A temporary ban from any sort of interaction or public -communication with the community for a specified period of time. No public or -private interaction with the people involved, including unsolicited interaction -with those enforcing the Code of Conduct, is allowed during this period. -Violating these terms may lead to a permanent ban. - -### 4. Permanent Ban - -**Community Impact**: Demonstrating a pattern of violation of community -standards, including sustained inappropriate behavior, harassment of an -individual, or aggression toward or disparagement of classes of individuals. - -**Consequence**: A permanent ban from any sort of public interaction within -the community. - -## Attribution - -This Code of Conduct is adapted from the [Contributor Covenant][homepage], -version 2.0, available at -https://www.contributor-covenant.org/version/2/0/code_of_conduct.html. - -Community Impact Guidelines were inspired by [Mozilla's code of conduct -enforcement ladder](https://github.com/mozilla/diversity). - -[homepage]: https://www.contributor-covenant.org - -For answers to common questions about this code of conduct, see the FAQ at -https://www.contributor-covenant.org/faq. Translations are available at -https://www.contributor-covenant.org/translations. diff --git a/README.md b/README.md index b2a680c..175654c 100644 --- a/README.md +++ b/README.md @@ -6,7 +6,7 @@ - [Commands](#commands) - [Verification](#verification) - [Privacy](#privacy) -- [Legal](#legal) +- [Self hosting and Legal](#self-hosting) ### About @@ -48,15 +48,15 @@ Nucleus is a moderation bot by Clicks for Discord. It adds features such as veri - `/user avatar` Shows the user avatar. - `/user track` Allows you to move a user up and down a role track. -- `/tags create` Creates a tag -- `/tags edit` Edits a tag -- `/tags delete` Deletes a tag +- `/tags create` Creates a tag. +- `/tags edit` Edits a tag. +- `/tags delete` Deletes a tag. - `/verify` Verifies a member to give them access to the server. - `/help` Shows all commands on Nucleus. - `/privacy` Information and options for server and user privacy. - `/rolemenu` Lets users select roles, similar to reaction roles. -- `/tag` Lets users use tags created with `/tags create` +- `/tag` Lets users use tags created with `/tags create`. ### Verification @@ -67,10 +67,10 @@ For more information, see the [about](https://clicks.codes/nucleus/verify/about) ### Privacy -You can run `/privacy` to view and manage all data stored about your server +You can run `/privacy` to view and manage all data stored about your server. You should always know what we know and store about you, so here is the complete list. -### Legal +### Self hosting -Before copying, modifying or running our code, please read [COPYING](https://github.com/ClicksMinutePer/Nucleus/blob/development/COPYING.md) +Nucleus is fully open source, and you can run your own copy. Read [COPYING.md](https://github.com/ClicksMinutePer/Nucleus/blob/development/COPYING.md) for the legal requirements and a guide for how to configure your own copy. diff --git a/src/actions/roleMenu.ts b/src/actions/roleMenu.ts index 7432a3a..21e97ec 100644 --- a/src/actions/roleMenu.ts +++ b/src/actions/roleMenu.ts @@ -63,7 +63,7 @@ export async function callback(interaction) { .setLabel("Online") .setStyle("LINK") .setDisabled(!up) - .setURL(`${client.config.baseUrl}/nucleus/rolemenu?code=${code}`), + .setURL(`${client.config.baseUrl}nucleus/rolemenu?code=${code}`), new MessageButton() .setLabel("Manual") .setStyle("PRIMARY") diff --git a/src/config/format.js b/src/config/format.js new file mode 100644 index 0000000..f87c9f7 --- /dev/null +++ b/src/config/format.js @@ -0,0 +1,96 @@ +import fs from 'fs'; +import * as readLine from 'node:readline/promises'; +import { exec } from 'node:child_process'; + +const defaultDict = { + "token": "Your bot token", + "developmentToken": "Your development bot token", + "managementGuildID": "Your management guild ID", + "developmentGuildID": "Your development guild ID", + "enableDevelopment": true, + "owners": [], + "verifySecret": "If using verify, enter a code here which matches your website if needed", + "mongoUrl": "Your Mongo connection string, e.g. mongodb://127.0.0.1:27017", + "baseUrl": "Your website where buttons such as Verify will link to, e.g. https://example.com", + "pastebinApiKey": "An API key for pastebin (optional)", + "pastebinUsername": "Your pastebin username (optional)", + "pastebinPassword": "Your pastebin password (optional)", +} + +const readline = readLine.createInterface({ + input: process.stdin, + output: process.stdout, +}); + +async function getInput(prompt) { + process.stdout.write(prompt); + + const answer = await readline.question(prompt); + return answer.toString(); +} + + +export default async function(walkthrough = false) { + if (walkthrough) { + console.log("\x1b[33m🛈 Entering walkthrough mode for any missing values."); + console.log(" \x1b[2mIf you don't want to enter a value, just hit enter.\x1b[0m\n"); + + // let toUse = await getInput("\x1b[36m[Installing packages] Use Yarn or NPM? \x1b[0m(\x1b[32my\x1b[0m/\x1b[31mN\x1b[0m) > "); + // toUse = toUse.toLowerCase() === "y" ? "yarn install" : "npm i"; + // if ((await getInput(`\x1b[36m[Installing packages] Run ${toUse}? \x1b[0m(\x1b[32mY\x1b[0m/\x1b[31mn\x1b[0m) > `)).toLowerCase() !== "n") { + // console.log(`\x1b[32m[Installing packages] Running ${toUse}...\x1b[0m`); + // await exec(toUse); + // console.log(`\x1b[32m[Installing packages] Installed\x1b[0m`); + // } else { + // console.log("\x1b[32m[Installing packages] Skipping...\x1b[0m"); + // } + } + + let json; + let out = true + try { + json = JSON.parse(fs.readFileSync('./src/config/main.json', 'utf8')); + } catch (e) { + console.log("\x1b[31m⚠ No main.json found, creating one.") + console.log(" \x1b[2mYou can edit src/config/main.json directly using template written to the file.\x1b[0m\n") + out = false + json = {} + } + for (const key in defaultDict) { + if (!json[key]) { + if (walkthrough) { + switch (key) { + case "enableDevelopment": { + json[key] = (await getInput("\x1b[36mEnable development mode? \x1b[0m(\x1b[32mY\x1b[0m/\x1b[31mn\x1b[0m) > ") || "Y").toLowerCase() === "y"; break; + } case "owners": { + let chosen = "!"; + let toWrite = [] + while (chosen !== "") { + chosen = await getInput("\x1b[36mEnter an owner ID \x1b[0m(\x1b[35mleave blank to finish\x1b[0m) > "); + if (chosen !== "") { toWrite.push(chosen); } + } + json[key] = toWrite; break; + } default: { + json[key] = await getInput(`\x1b[36m${key} \x1b[0m(\x1b[35m${defaultDict[key]}\x1b[0m) > `); + } + } + } + else { json[key] = defaultDict[key] } + } + } + if (!json.mongoUrl.endsWith("/")) json.mongoUrl += "/"; + if (!json.baseUrl.endsWith("/")) json.baseUrl += "/"; + let hosts = fs.readFileSync('/etc/hosts', 'utf8').toString().split("\n"); + let localhost = hosts.find(line => line.split(" ")[1] === "localhost"); + if (localhost) { localhost = localhost.split(" ")[0]; } + else { localhost = "127.0.0.1" } + json.mongoUrl = json.mongoUrl.replace("localhost", localhost); + json.baseUrl = json.baseUrl.replace("localhost", localhost); + + fs.writeFileSync("./src/config/main.json", JSON.stringify(json, null, 4)) + + if (walkthrough) { + console.log("\x1b[32m✓ All properties added.\x1b[0m") + } + return out; +} diff --git a/src/reflex/verify.ts b/src/reflex/verify.ts index b95cdb7..b95d5db 100644 --- a/src/reflex/verify.ts +++ b/src/reflex/verify.ts @@ -133,6 +133,6 @@ export default async function(interaction) { ], components: [new Discord.MessageActionRow().addComponents([new Discord.MessageButton() .setLabel("Verify") .setStyle("LINK") - .setURL(`${client.config.baseUrl}/nucleus/verify?code=${code}`) + .setURL(`${client.config.baseUrl}nucleus/verify?code=${code}`) ])]}); } diff --git a/tsconfig.json b/tsconfig.json index 591467f..e38a3bc 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -11,6 +11,6 @@ "moduleResolution": "node", "skipLibCheck": true }, - "include": ["src/**/*"], + "include": ["src/**/*", "isntaller.js"], "exclude": [] } \ No newline at end of file