Compare commits
10 Commits
83f86214b5
...
9ece949220
Author | SHA1 | Date |
---|---|---|
Hri7566 | 9ece949220 | |
Hri7566 | 2cfde1001e | |
Hri7566 | a92873a613 | |
Hri7566 | c835b0b979 | |
Hri7566 | 2074915830 | |
Hri7566 | d4a6c599ac | |
Hri7566 | ac43825c27 | |
Hri7566 | 8e75aaad07 | |
Hri7566 | ebbdb15f80 | |
Hri7566 | 363b00b949 |
|
@ -1,8 +0,0 @@
|
|||
# - uri: wss://mppclone.com:8443
|
||||
# channel:
|
||||
# id: "✧𝓓𝓔𝓥 𝓡𝓸𝓸𝓶✧"
|
||||
# allowColorChanging: true
|
||||
- uri: wss://mppclone.com:8443
|
||||
channel:
|
||||
id: "test/fishing"
|
||||
allowColorChanging: true
|
|
@ -0,0 +1,8 @@
|
|||
- uri: wss://mppclone.com:8443
|
||||
channel:
|
||||
id: "✧𝓓𝓔𝓥 𝓡𝓸𝓸𝓶✧"
|
||||
allowColorChanging: true
|
||||
- uri: wss://mppclone.com:8443
|
||||
channel:
|
||||
id: "test/fishing"
|
||||
allowColorChanging: true
|
24
package.json
24
package.json
|
@ -4,24 +4,26 @@
|
|||
"type": "module",
|
||||
"scripts": {
|
||||
"start": "bun .",
|
||||
"start-bot": "bun src/mpp/index.ts"
|
||||
"start-bot": "bun src/mpp/index.ts",
|
||||
"start-discord": "bun src/discord/index.ts"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@types/bun": "latest"
|
||||
"@types/bun": "^1.1.6"
|
||||
},
|
||||
"peerDependencies": {
|
||||
"typescript": "^5.0.0"
|
||||
"typescript": "^5.3.3"
|
||||
},
|
||||
"dependencies": {
|
||||
"@prisma/client": "^5.9.1",
|
||||
"@prisma/client": "^5.16.1",
|
||||
"@trpc/client": "next",
|
||||
"@trpc/server": "next",
|
||||
"cli-markdown": "^3.2.2",
|
||||
"discord.js": "^14.14.1",
|
||||
"mpp-client-net": "^1.1.3",
|
||||
"prisma": "^5.9.1",
|
||||
"trpc-bun-adapter": "^1.1.0",
|
||||
"yaml": "^2.3.4",
|
||||
"zod": "^3.22.4"
|
||||
"@types/node": "^20.14.10",
|
||||
"cli-markdown": "^3.4.0",
|
||||
"discord.js": "^14.15.3",
|
||||
"mpp-client-net": "^1.2.0",
|
||||
"prisma": "^5.16.1",
|
||||
"trpc-bun-adapter": "^1.1.1",
|
||||
"yaml": "^2.4.5",
|
||||
"zod": "^3.23.8"
|
||||
}
|
||||
}
|
||||
|
|
|
@ -0,0 +1,24 @@
|
|||
# build output
|
||||
dist/
|
||||
|
||||
# generated types
|
||||
.astro/
|
||||
|
||||
# dependencies
|
||||
node_modules/
|
||||
|
||||
# logs
|
||||
npm-debug.log*
|
||||
yarn-debug.log*
|
||||
yarn-error.log*
|
||||
pnpm-debug.log*
|
||||
|
||||
# environment variables
|
||||
.env
|
||||
.env.production
|
||||
|
||||
# macOS-specific files
|
||||
.DS_Store
|
||||
|
||||
# jetbrains setting folder
|
||||
.idea/
|
|
@ -0,0 +1,4 @@
|
|||
{
|
||||
"recommendations": ["astro-build.astro-vscode"],
|
||||
"unwantedRecommendations": []
|
||||
}
|
|
@ -0,0 +1,11 @@
|
|||
{
|
||||
"version": "0.2.0",
|
||||
"configurations": [
|
||||
{
|
||||
"command": "./node_modules/.bin/astro dev",
|
||||
"name": "Development server",
|
||||
"request": "launch",
|
||||
"type": "node-terminal"
|
||||
}
|
||||
]
|
||||
}
|
|
@ -0,0 +1,54 @@
|
|||
# Astro Starter Kit: Basics
|
||||
|
||||
```sh
|
||||
npm create astro@latest -- --template basics
|
||||
```
|
||||
|
||||
[![Open in StackBlitz](https://developer.stackblitz.com/img/open_in_stackblitz.svg)](https://stackblitz.com/github/withastro/astro/tree/latest/examples/basics)
|
||||
[![Open with CodeSandbox](https://assets.codesandbox.io/github/button-edit-lime.svg)](https://codesandbox.io/p/sandbox/github/withastro/astro/tree/latest/examples/basics)
|
||||
[![Open in GitHub Codespaces](https://github.com/codespaces/badge.svg)](https://codespaces.new/withastro/astro?devcontainer_path=.devcontainer/basics/devcontainer.json)
|
||||
|
||||
> 🧑🚀 **Seasoned astronaut?** Delete this file. Have fun!
|
||||
|
||||
![just-the-basics](https://github.com/withastro/astro/assets/2244813/a0a5533c-a856-4198-8470-2d67b1d7c554)
|
||||
|
||||
## 🚀 Project Structure
|
||||
|
||||
Inside of your Astro project, you'll see the following folders and files:
|
||||
|
||||
```text
|
||||
/
|
||||
├── public/
|
||||
│ └── favicon.svg
|
||||
├── src/
|
||||
│ ├── components/
|
||||
│ │ └── Card.astro
|
||||
│ ├── layouts/
|
||||
│ │ └── Layout.astro
|
||||
│ └── pages/
|
||||
│ └── index.astro
|
||||
└── package.json
|
||||
```
|
||||
|
||||
Astro looks for `.astro` or `.md` files in the `src/pages/` directory. Each page is exposed as a route based on its file name.
|
||||
|
||||
There's nothing special about `src/components/`, but that's where we like to put any Astro/React/Vue/Svelte/Preact components.
|
||||
|
||||
Any static assets, like images, can be placed in the `public/` directory.
|
||||
|
||||
## 🧞 Commands
|
||||
|
||||
All commands are run from the root of the project, from a terminal:
|
||||
|
||||
| Command | Action |
|
||||
| :------------------------ | :----------------------------------------------- |
|
||||
| `npm install` | Installs dependencies |
|
||||
| `npm run dev` | Starts local dev server at `localhost:4321` |
|
||||
| `npm run build` | Build your production site to `./dist/` |
|
||||
| `npm run preview` | Preview your build locally, before deploying |
|
||||
| `npm run astro ...` | Run CLI commands like `astro add`, `astro check` |
|
||||
| `npm run astro -- --help` | Get help using the Astro CLI |
|
||||
|
||||
## 👀 Want to learn more?
|
||||
|
||||
Feel free to check [our documentation](https://docs.astro.build) or jump into our [Discord server](https://astro.build/chat).
|
|
@ -0,0 +1,8 @@
|
|||
import { defineConfig } from 'astro/config';
|
||||
|
||||
import tailwind from "@astrojs/tailwind";
|
||||
|
||||
// https://astro.build/config
|
||||
export default defineConfig({
|
||||
integrations: [tailwind()]
|
||||
});
|
|
@ -0,0 +1,19 @@
|
|||
{
|
||||
"name": "site",
|
||||
"type": "module",
|
||||
"version": "0.0.1",
|
||||
"scripts": {
|
||||
"dev": "astro dev",
|
||||
"start": "astro dev",
|
||||
"build": "astro check && astro build",
|
||||
"preview": "astro preview",
|
||||
"astro": "astro"
|
||||
},
|
||||
"dependencies": {
|
||||
"@astrojs/check": "^0.7.0",
|
||||
"@astrojs/tailwind": "^5.1.0",
|
||||
"astro": "^4.10.2",
|
||||
"tailwindcss": "^3.4.4",
|
||||
"typescript": "^5.4.5"
|
||||
}
|
||||
}
|
File diff suppressed because it is too large
Load Diff
|
@ -0,0 +1,9 @@
|
|||
<svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 128 128">
|
||||
<path d="M50.4 78.5a75.1 75.1 0 0 0-28.5 6.9l24.2-65.7c.7-2 1.9-3.2 3.4-3.2h29c1.5 0 2.7 1.2 3.4 3.2l24.2 65.7s-11.6-7-28.5-7L67 45.5c-.4-1.7-1.6-2.8-2.9-2.8-1.3 0-2.5 1.1-2.9 2.7L50.4 78.5Zm-1.1 28.2Zm-4.2-20.2c-2 6.6-.6 15.8 4.2 20.2a17.5 17.5 0 0 1 .2-.7 5.5 5.5 0 0 1 5.7-4.5c2.8.1 4.3 1.5 4.7 4.7.2 1.1.2 2.3.2 3.5v.4c0 2.7.7 5.2 2.2 7.4a13 13 0 0 0 5.7 4.9v-.3l-.2-.3c-1.8-5.6-.5-9.5 4.4-12.8l1.5-1a73 73 0 0 0 3.2-2.2 16 16 0 0 0 6.8-11.4c.3-2 .1-4-.6-6l-.8.6-1.6 1a37 37 0 0 1-22.4 2.7c-5-.7-9.7-2-13.2-6.2Z" />
|
||||
<style>
|
||||
path { fill: #000; }
|
||||
@media (prefers-color-scheme: dark) {
|
||||
path { fill: #FFF; }
|
||||
}
|
||||
</style>
|
||||
</svg>
|
After Width: | Height: | Size: 749 B |
|
@ -0,0 +1 @@
|
|||
/// <reference types="astro/client" />
|
|
@ -0,0 +1,36 @@
|
|||
---
|
||||
interface Props {
|
||||
title: string;
|
||||
}
|
||||
|
||||
const { title } = Astro.props;
|
||||
---
|
||||
|
||||
<!doctype html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<meta charset="UTF-8" />
|
||||
<meta name="description" content="Astro description" />
|
||||
<meta name="viewport" content="width=device-width" />
|
||||
<link rel="icon" type="image/svg+xml" href="/favicon.svg" />
|
||||
<meta name="generator" content={Astro.generator} />
|
||||
<title>Fishing - {title}</title>
|
||||
</head>
|
||||
<body>
|
||||
<slot />
|
||||
</body>
|
||||
</html>
|
||||
|
||||
<style>
|
||||
html, body {
|
||||
font: 20pt verdana, "DejaVu Sans", sans-serif;
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
color: white;
|
||||
text-shadow: #444 1px 1px;
|
||||
}
|
||||
|
||||
body {
|
||||
background: radial-gradient(rgb(115, 179, 204) 0%, rgb(39, 53, 70) 100%);
|
||||
}
|
||||
</style>
|
|
@ -0,0 +1,26 @@
|
|||
---
|
||||
import Layout from "../layouts/Layout.astro";
|
||||
---
|
||||
|
||||
<Layout title="Home">
|
||||
<main>
|
||||
<div id="container" class="px-5 py-2 mx-auto w-[60%]">
|
||||
<h1 class="text-xl">Fishing Bot</h1>
|
||||
<br />
|
||||
|
||||
<div
|
||||
id="page-content"
|
||||
class="bg-[#fea] border border-[#fea] p-[10px]"
|
||||
>
|
||||
<h2 class="border-b border-[#f84]">Discord</h2>
|
||||
<p class="text-[14pt] py-2">
|
||||
Click <a
|
||||
href="https://discord.gg/HN7UkGnR9h"
|
||||
class="text-[#f46] hover:text-[#e05] hover:underline"
|
||||
>here</a
|
||||
> to join the Discord server!
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
</main>
|
||||
</Layout>
|
|
@ -0,0 +1,8 @@
|
|||
/** @type {import('tailwindcss').Config} */
|
||||
export default {
|
||||
content: ['./src/**/*.{astro,html,js,jsx,md,mdx,svelte,ts,tsx,vue}'],
|
||||
theme: {
|
||||
extend: {},
|
||||
},
|
||||
plugins: [],
|
||||
}
|
|
@ -0,0 +1,3 @@
|
|||
{
|
||||
"extends": "astro/tsconfigs/strict"
|
||||
}
|
|
@ -7,7 +7,9 @@ const logger = new Logger("Server");
|
|||
export const server = Bun.serve(
|
||||
createBunServeHandler({
|
||||
router: appRouter,
|
||||
createContext: createContext
|
||||
createContext: createContext,
|
||||
req: new Request("https://github.com/Hri7566"),
|
||||
endpoint: "/"
|
||||
})
|
||||
);
|
||||
|
||||
|
|
|
@ -37,8 +37,9 @@ export const go = new Command(
|
|||
inventory.location = nextLoc.id;
|
||||
await updateInventory(inventory);
|
||||
|
||||
if (getFishing(id, user.id)) {
|
||||
stopFishing(id, user.id, false);
|
||||
let fisher;
|
||||
if (fisher = getFishing(id, user.id)) {
|
||||
stopFishing(id, user.id, fisher.channel, false);
|
||||
return `You ${prefix}${reel.aliases[0]}ed your LURE in and went to ${nextLoc.name}.`;
|
||||
}
|
||||
|
||||
|
|
|
@ -4,7 +4,7 @@ import { CosmicColor } from "@util/CosmicColor";
|
|||
export const color = new Command(
|
||||
"color",
|
||||
["color"],
|
||||
"Get the name of a color",
|
||||
"Get the name of your color/any hex color",
|
||||
"color [hex color]",
|
||||
"command.general.color",
|
||||
async ({ id, command, args, prefix, part, user }) => {
|
||||
|
|
|
@ -17,7 +17,7 @@ export const help = new Command(
|
|||
"cammands",
|
||||
"cummunds"
|
||||
],
|
||||
"Get command list or command usage",
|
||||
"Get a list of commands, or how to use them",
|
||||
"help [command]",
|
||||
"command.general.help",
|
||||
async ({ id, command, args, prefix, part, user }) => {
|
||||
|
|
|
@ -0,0 +1,13 @@
|
|||
import Command from "@server/commands/Command";
|
||||
|
||||
export const info = new Command(
|
||||
"info",
|
||||
["info"],
|
||||
"Get your own user ID",
|
||||
"info",
|
||||
"command.general.info",
|
||||
async ({ id, command, args, prefix, part, user }) => {
|
||||
return `🌊 Made by Hri7566 | Original created by Brandon Lockaby`;
|
||||
},
|
||||
false
|
||||
);
|
|
@ -3,7 +3,7 @@ import Command from "@server/commands/Command";
|
|||
export const myid = new Command(
|
||||
"myid",
|
||||
["myid"],
|
||||
"Get your own ID",
|
||||
"Get your own user ID",
|
||||
"myid",
|
||||
"command.general.myid",
|
||||
async ({ id, command, args, prefix, part, user }) => {
|
||||
|
|
|
@ -22,6 +22,9 @@ import { yeet } from "./inventory/yeet";
|
|||
import { tree } from "./fishing/tree";
|
||||
import { pick } from "./fishing/pick";
|
||||
import { fid } from "./util/fid";
|
||||
import { chance } from "./util/chance";
|
||||
import { info } from "./general/info";
|
||||
import { burger } from "./util/burger";
|
||||
// import { give } from "./inventory/give";
|
||||
|
||||
interface ICommandGroup {
|
||||
|
@ -35,7 +38,7 @@ export const commandGroups: ICommandGroup[] = [];
|
|||
const generalGroup: ICommandGroup = {
|
||||
id: "general",
|
||||
displayName: "General",
|
||||
commands: [help, color, myid]
|
||||
commands: [help, color, myid, info]
|
||||
};
|
||||
|
||||
commandGroups.push(generalGroup);
|
||||
|
@ -51,7 +54,7 @@ commandGroups.push(fishingGroup);
|
|||
const inventoryGroup: ICommandGroup = {
|
||||
id: "inventory",
|
||||
displayName: "Inventory",
|
||||
commands: [inventory, take, eat, sack, pokemon, yeet /* give */]
|
||||
commands: [inventory, take, eat, sack, pokemon, yeet, burger /* give */]
|
||||
};
|
||||
|
||||
commandGroups.push(inventoryGroup);
|
||||
|
@ -59,7 +62,7 @@ commandGroups.push(inventoryGroup);
|
|||
const utilGroup: ICommandGroup = {
|
||||
id: "util",
|
||||
displayName: "Utility",
|
||||
commands: [data, setcolor, memory, autofish, pokedex, fid]
|
||||
commands: [data, setcolor, memory, autofish, pokedex, fid, chance]
|
||||
};
|
||||
|
||||
commandGroups.push(utilGroup);
|
||||
|
|
|
@ -108,15 +108,21 @@ export const eat = new Command(
|
|||
|
||||
if (foundObject.id == "sand") {
|
||||
if (res) {
|
||||
if (res.and)
|
||||
if (res.and) {
|
||||
return `Our friend ${part.name} ate of his/her ${foundObject.name} ${res.and}`;
|
||||
} else {
|
||||
return `Our friend ${part.name} ate of his/her ${foundObject.name}.`;
|
||||
}
|
||||
} else {
|
||||
return `Our friend ${part.name} ate of his/her ${foundObject.name}.`;
|
||||
}
|
||||
} else {
|
||||
if (res) {
|
||||
if (res.and)
|
||||
if (res.and) {
|
||||
return `Our friend ${part.name} ate his/her ${foundObject.name} ${res.and}`;
|
||||
} else {
|
||||
return `Our friend ${part.name} ate his/her ${foundObject.name}.`;
|
||||
}
|
||||
} else {
|
||||
return `Our friend ${part.name} ate his/her ${foundObject.name}.`;
|
||||
}
|
||||
|
|
|
@ -5,8 +5,8 @@ import prisma from "@server/data/prisma";
|
|||
|
||||
export const inventory = new Command(
|
||||
"inventory",
|
||||
["inventory", "inv", "i"],
|
||||
"Look at your inventory",
|
||||
["inventory", "inv", "items", "i"],
|
||||
"List your inventory items and details",
|
||||
"inventory",
|
||||
"command.inventory.inventory",
|
||||
async ({ id, command, args, prefix, part, user }) => {
|
||||
|
@ -37,32 +37,28 @@ export const inventory = new Command(
|
|||
|
||||
const items = inv.items as TInventoryItems;
|
||||
|
||||
return `Contents of ${decidedUser.name}'s inventory: ${
|
||||
items
|
||||
.map(
|
||||
(item: IItem) =>
|
||||
`${item.emoji || "📦"}${item.name}${
|
||||
item.count ? ` (x${item.count})` : ""
|
||||
}`
|
||||
)
|
||||
.join(", ") || "(none)"
|
||||
}`;
|
||||
return `Contents of ${decidedUser.name}'s inventory: ${items
|
||||
.map(
|
||||
(item: IItem) =>
|
||||
`${item.emoji || "📦"}${item.name}${item.count ? ` (x${item.count})` : ""
|
||||
}`
|
||||
)
|
||||
.join(", ") || "(none)"
|
||||
}`;
|
||||
} else {
|
||||
const inv = await getInventory(user.inventoryId);
|
||||
if (!inv)
|
||||
return `Apparently, you have no inventory. Not sure if that can be fixed, and I don't know how you got this message.`;
|
||||
const items = inv.items as TInventoryItems;
|
||||
|
||||
return `Contents of ${part.name}'s inventory: ${
|
||||
items
|
||||
.map(
|
||||
(item: IItem) =>
|
||||
`${item.emoji || "📦"}${item.name}${
|
||||
item.count ? ` (x${item.count})` : ""
|
||||
}`
|
||||
)
|
||||
.join(", ") || "(none)"
|
||||
}`;
|
||||
return `Contents of ${part.name}'s inventory: ${items
|
||||
.map(
|
||||
(item: IItem) =>
|
||||
`${item.emoji || "📦"}${item.name}${item.count ? ` (x${item.count})` : ""
|
||||
}`
|
||||
)
|
||||
.join(", ") || "(none)"
|
||||
}`;
|
||||
}
|
||||
}
|
||||
);
|
||||
|
|
|
@ -4,7 +4,7 @@ import { getInventory } from "@server/data/inventory";
|
|||
export const pokemon = new Command(
|
||||
"pokemon",
|
||||
["pokemon"],
|
||||
"Look at your Pokemon",
|
||||
"List your Pokémon collection",
|
||||
"pokemon",
|
||||
"command.inventory.pokemon",
|
||||
async ({ id, command, args, prefix, part, user }) => {
|
||||
|
@ -13,16 +13,14 @@ export const pokemon = new Command(
|
|||
|
||||
const sack = inv.pokemon as TPokemonSack[];
|
||||
|
||||
return `Friend ${part.name}'s Pokémon: ${
|
||||
sack
|
||||
.map(
|
||||
(pokemon: IPokemon) =>
|
||||
`${pokemon.emoji || ""}${pokemon.name}${
|
||||
pokemon.count ? ` (x${pokemon.count})` : ""
|
||||
}`
|
||||
)
|
||||
.join(", ") || "(none)"
|
||||
}`;
|
||||
return `Friend ${part.name}'s Pokémon: ${sack
|
||||
.map(
|
||||
(pokemon: IPokemon) =>
|
||||
`${pokemon.emoji || ""}${pokemon.name}${pokemon.count ? ` (x${pokemon.count})` : ""
|
||||
}`
|
||||
)
|
||||
.join(", ") || "(none)"
|
||||
}`;
|
||||
},
|
||||
true
|
||||
);
|
||||
|
|
|
@ -5,8 +5,8 @@ import type { User } from "@prisma/client";
|
|||
|
||||
export const sack = new Command(
|
||||
"sack",
|
||||
["sack", "caught"],
|
||||
"Look at your fish sack",
|
||||
["sack", "caught", "catched", "sock", "fish-sack", "fishies", "myfish", "mysack", "sacks"],
|
||||
"List your caught fish",
|
||||
"sack [user ID]",
|
||||
"command.inventory.sack",
|
||||
async ({ id, command, args, prefix, part, user }) => {
|
||||
|
@ -37,31 +37,27 @@ export const sack = new Command(
|
|||
|
||||
const fishSack = inv.fishSack as TFishSack;
|
||||
|
||||
return `Contents of ${foundUser.name}'s fish sack: ${
|
||||
fishSack
|
||||
.map(
|
||||
(fish: IFish) =>
|
||||
`${fish.emoji || "🐟"}${fish.name}${
|
||||
fish.count ? ` (x${fish.count})` : ""
|
||||
}`
|
||||
)
|
||||
.join(", ") || "(none)"
|
||||
}`;
|
||||
return `Contents of ${foundUser.name}'s fish sack: ${fishSack
|
||||
.map(
|
||||
(fish: IFish) =>
|
||||
`${fish.emoji || "🐟"}${fish.name}${fish.count ? ` (x${fish.count})` : ""
|
||||
}`
|
||||
)
|
||||
.join(", ") || "(none)"
|
||||
}`;
|
||||
} else {
|
||||
const inv = await getInventory(user.inventoryId);
|
||||
if (!inv) return;
|
||||
const fishSack = inv.fishSack as TFishSack;
|
||||
|
||||
return `Contents of ${part.name}'s fish sack: ${
|
||||
fishSack
|
||||
.map(
|
||||
(fish: IFish) =>
|
||||
`${fish.emoji || "🐟"}${fish.name}${
|
||||
fish.count ? ` (x${fish.count})` : ""
|
||||
}`
|
||||
)
|
||||
.join(", ") || "(none)"
|
||||
}`;
|
||||
return `Contents of ${part.name}'s fish sack: ${fishSack
|
||||
.map(
|
||||
(fish: IFish) =>
|
||||
`${fish.emoji || "🐟"}${fish.name}${fish.count ? ` (x${fish.count})` : ""
|
||||
}`
|
||||
)
|
||||
.join(", ") || "(none)"
|
||||
}`;
|
||||
}
|
||||
}
|
||||
);
|
||||
|
|
|
@ -12,18 +12,17 @@ export const autofish = new Command(
|
|||
const fishing = getFishing(props.id, props.part.id);
|
||||
|
||||
if (!fishing) {
|
||||
startFishing(props.id, props.part.id, true, true);
|
||||
startFishing(props.id, props.part.id, props.channel, true, true);
|
||||
return `Our friend ${props.user.name} casts LURE into a water with AUTOFISH enabled. (${props.prefix}${reel.aliases[0]} to disable)`;
|
||||
} else {
|
||||
return `Your lure is already in the water (since ${(
|
||||
(Date.now() - fishing.t) /
|
||||
1000 /
|
||||
60
|
||||
).toFixed(2)} minutes ago).${
|
||||
fishing.autofish
|
||||
).toFixed(2)} minutes ago).${fishing.autofish
|
||||
? ` (AUTOFISH is enabled)`
|
||||
: ` (${props.prefix}${reel.aliases[0]} in first to start AUTOFISH)`
|
||||
}`;
|
||||
}`;
|
||||
}
|
||||
}
|
||||
);
|
||||
|
|
|
@ -0,0 +1,29 @@
|
|||
import { addBack } from "@server/backs";
|
||||
import Command from "@server/commands/Command";
|
||||
import { getInventory, updateInventory } from "@server/data/inventory";
|
||||
import { addItem } from "@server/items";
|
||||
|
||||
export const burger = new Command(
|
||||
"burger",
|
||||
["burger"],
|
||||
"Get a burger",
|
||||
"burger",
|
||||
"command.util.burger",
|
||||
async ({ id, command, args, prefix, part, user }) => {
|
||||
const burger = {
|
||||
id: "burger",
|
||||
name: "Burger",
|
||||
objtype: "item",
|
||||
emoji: "🍔"
|
||||
};
|
||||
|
||||
const inv = await getInventory(user.inventoryId);
|
||||
if (!inv) return "something has gone *terribly* wrong";
|
||||
|
||||
addItem(inv.items as unknown as IObject[], burger);
|
||||
await updateInventory(inv);
|
||||
|
||||
return "you now have burger";
|
||||
},
|
||||
false
|
||||
);
|
|
@ -0,0 +1,16 @@
|
|||
import { addBack } from "@server/backs";
|
||||
import Command from "@server/commands/Command";
|
||||
import { getFishingChance } from "@server/fish/fishers";
|
||||
|
||||
export const chance = new Command(
|
||||
"chance",
|
||||
["chance"],
|
||||
"Set own user color",
|
||||
"chance",
|
||||
"command.util.chance",
|
||||
async ({ id, command, args, prefix, part, user }) => {
|
||||
const chance = await getFishingChance(user.id);
|
||||
return `Fishing chance: ${chance.chance} | Timestamp: ${chance.t}`;
|
||||
},
|
||||
false
|
||||
);
|
|
@ -1,5 +1,4 @@
|
|||
import { kvGet, kvSet } from "@server/data/keyValueStore";
|
||||
import { getObjectStorage } from "@server/data/location";
|
||||
import { addTickEvent, removeTickEvent } from "@util/tick";
|
||||
import { getSizeString, randomFish } from "./fish";
|
||||
import { getUser } from "@server/data/user";
|
||||
|
@ -42,10 +41,12 @@ export async function tick() {
|
|||
|
||||
const r = Math.random();
|
||||
const data = await getFishingChance(user.id);
|
||||
// After 30 minutes, reset chance
|
||||
if (data.t > 30 * 60000) await resetFishingChance(user.id);
|
||||
|
||||
if (r < data.chance / 10) {
|
||||
// After 60 minutes, reset chance
|
||||
if (data.t > Date.now() + 60 * 60000)
|
||||
await resetFishingChance(user.id);
|
||||
|
||||
stopFishing(
|
||||
winner.id,
|
||||
winner.userID,
|
||||
|
@ -53,18 +54,26 @@ export async function tick() {
|
|||
winner.autofish,
|
||||
winner.autofish_t
|
||||
);
|
||||
|
||||
// Save to sack
|
||||
const animal = randomFish(inventory.location);
|
||||
addItem(inventory.fishSack as TFishSack, animal);
|
||||
await updateInventory(inventory);
|
||||
|
||||
const size = getSizeString(animal.size);
|
||||
const p = prefixes[0];
|
||||
const emoji = animal.emoji || "🐟";
|
||||
|
||||
addBack(winner.id, {
|
||||
m: "sendchat",
|
||||
channel: winner.channel,
|
||||
message: `Our good friend @${user.id} caught a ${size} ${
|
||||
animal.emoji || "🐟"
|
||||
}${animal.name}! ready to ${prefixes[0]}eat or ${
|
||||
prefixes[0]
|
||||
}fish again${winner.autofish ? " (AUTOFISH is enabled)" : ""}`,
|
||||
message: `Our good friend @${
|
||||
user.id
|
||||
} caught a ${size} ${emoji}${
|
||||
animal.name
|
||||
}! ready to ${p}eat or ${p}fish again${
|
||||
winner.autofish ? " (AUTOFISH is enabled)" : ""
|
||||
}`,
|
||||
isDM: winner.isDM,
|
||||
id: winner.userID
|
||||
});
|
||||
|
@ -155,6 +164,7 @@ export async function getFishingChance(userID: string) {
|
|||
|
||||
export async function resetFishingChance(userID: string) {
|
||||
const key = `fishingChance~${userID}`;
|
||||
// logger.debug("Resetting fishing chance for user " + userID);
|
||||
await kvSet(key, {
|
||||
t: Date.now(),
|
||||
chance: 1
|
||||
|
|
|
@ -7,11 +7,12 @@ import { Logger } from "@util/Logger";
|
|||
import { loadConfig } from "@util/config";
|
||||
import { addTickEvent, removeTickEvent } from "@util/tick";
|
||||
|
||||
export const locations = loadConfig<ILocation[]>("config/locations.yml", [
|
||||
export const locations = loadConfig<TAnyLocation[]>("config/locations.yml", [
|
||||
{
|
||||
id: "pond",
|
||||
name: "Pond",
|
||||
nearby: ["lake", "river", "sea"],
|
||||
canFish: true,
|
||||
hasSand: true,
|
||||
objects: []
|
||||
},
|
||||
|
@ -19,6 +20,7 @@ export const locations = loadConfig<ILocation[]>("config/locations.yml", [
|
|||
id: "lake",
|
||||
name: "Lake",
|
||||
nearby: ["pond", "river", "sea"],
|
||||
canFish: true,
|
||||
hasSand: false,
|
||||
objects: []
|
||||
},
|
||||
|
@ -26,6 +28,7 @@ export const locations = loadConfig<ILocation[]>("config/locations.yml", [
|
|||
id: "river",
|
||||
name: "River",
|
||||
nearby: ["pond", "lake", "sea"],
|
||||
canFish: true,
|
||||
hasSand: false,
|
||||
objects: []
|
||||
},
|
||||
|
@ -33,6 +36,7 @@ export const locations = loadConfig<ILocation[]>("config/locations.yml", [
|
|||
id: "sea",
|
||||
name: "Sea",
|
||||
nearby: ["pond", "lake", "river"],
|
||||
canFish: true,
|
||||
hasSand: true,
|
||||
objects: []
|
||||
}
|
||||
|
@ -49,9 +53,10 @@ const logger = new Logger("Places");
|
|||
|
||||
export function populateSand() {
|
||||
for (const loc of locations) {
|
||||
if (!("hasSand" in loc)) continue;
|
||||
if (!loc.hasSand) continue;
|
||||
|
||||
let existing = loc.objects.find(obj => obj.id == "sand");
|
||||
let existing = loc.objects.find((obj: ILocation) => obj.id == "sand");
|
||||
if (typeof existing !== "undefined") continue;
|
||||
|
||||
loc.objects.push(sand);
|
||||
|
|
|
@ -5,25 +5,37 @@ export const fish: IBehaviorDefinition = {
|
|||
id: "fish",
|
||||
bhv: {
|
||||
async eat(obj, props) {
|
||||
const color = new CosmicColor(
|
||||
Math.floor(Math.random() * 255),
|
||||
Math.floor(Math.random() * 255),
|
||||
Math.floor(Math.random() * 255)
|
||||
);
|
||||
const r = Math.random();
|
||||
|
||||
addBack(props.id, {
|
||||
m: "color",
|
||||
id: props.part.id,
|
||||
color: color.toHexa()
|
||||
});
|
||||
const fish = obj as IFish;
|
||||
|
||||
return {
|
||||
success: true,
|
||||
shouldRemove: true,
|
||||
and: `and it made him/her turn ${color
|
||||
.getName()
|
||||
.toLowerCase()}.`
|
||||
};
|
||||
// 50%
|
||||
if (r < 0.5) {
|
||||
const color = new CosmicColor(
|
||||
Math.floor(Math.random() * 255),
|
||||
Math.floor(Math.random() * 255),
|
||||
Math.floor(Math.random() * 255)
|
||||
);
|
||||
|
||||
addBack(props.id, {
|
||||
m: "color",
|
||||
id: props.part.id,
|
||||
color: color.toHexa()
|
||||
});
|
||||
|
||||
return {
|
||||
success: true,
|
||||
shouldRemove: true,
|
||||
and: `and it made him/her turn ${color
|
||||
.getName()
|
||||
.toLowerCase()}.`
|
||||
};
|
||||
} else {
|
||||
return {
|
||||
success: true,
|
||||
shouldRemove: true
|
||||
};
|
||||
}
|
||||
}
|
||||
}
|
||||
};
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
import { Logger } from "@util/Logger";
|
||||
import { createInterface, type ReadLine } from "readline";
|
||||
import { createInterface } from "readline";
|
||||
import { EventEmitter } from "events";
|
||||
import gettRPC from "@util/api/trpc";
|
||||
import { startAutorestart } from "@util/autorestart";
|
||||
|
|
|
@ -51,11 +51,19 @@ export class MPPNetBot {
|
|||
this.logger.info(
|
||||
`Received channel update for channel ID "${msg.ch._id}"`
|
||||
);
|
||||
|
||||
if (msg._id !== this.config.channel.id) {
|
||||
this.client.setChannel(this.config.channel.id);
|
||||
}
|
||||
});
|
||||
|
||||
this.client.on("a", async msg => {
|
||||
let prefixes: string[];
|
||||
|
||||
if (this.client.channel._id !== this.config.channel.id) {
|
||||
return;
|
||||
}
|
||||
|
||||
try {
|
||||
prefixes = await this.trpc.prefixes.query();
|
||||
} catch (err) {
|
||||
|
|
|
@ -6,7 +6,7 @@ const logger = new Logger("big brain");
|
|||
|
||||
const bots: MPPNetBot[] = [];
|
||||
|
||||
const defaults = loadConfig("config/bots.yml", [
|
||||
const defaults = loadConfig("config/mpp_bots.yml", [
|
||||
{
|
||||
uri: "wss://mppclone.com:8443",
|
||||
channel: {
|
||||
|
|
|
@ -6,14 +6,14 @@ import type { AppRouter } from "@server/api/trpc";
|
|||
export function gettRPC(token: string) {
|
||||
return createTRPCClient<AppRouter>({
|
||||
links: [
|
||||
// httpBatchLink({
|
||||
// url: "http://localhost:3000",
|
||||
// headers() {
|
||||
// return {
|
||||
// Authorization: token
|
||||
// };
|
||||
// }
|
||||
// }),
|
||||
httpBatchLink({
|
||||
url: "http://localhost:3000",
|
||||
headers() {
|
||||
return {
|
||||
Authorization: token
|
||||
};
|
||||
}
|
||||
}),
|
||||
httpBatchLink({
|
||||
url: "https://fishing.hri7566.info/api",
|
||||
headers() {
|
||||
|
|
|
@ -101,9 +101,26 @@ interface ILocation {
|
|||
name: string;
|
||||
nearby: string[];
|
||||
objects: IObject[];
|
||||
hasSand: boolean;
|
||||
}
|
||||
|
||||
interface IFishingLocation extends ILocation {
|
||||
canFish: true;
|
||||
}
|
||||
|
||||
interface ISandyLocation extends ILocation {
|
||||
hasSand: true;
|
||||
}
|
||||
|
||||
interface IShopLocation extends ILocation {
|
||||
isShop: true;
|
||||
}
|
||||
|
||||
type TAnyLocation =
|
||||
| ILocation
|
||||
| IFishingLocation
|
||||
| ISandyFishingLocation
|
||||
| IShopLocation;
|
||||
|
||||
interface TFisher {
|
||||
id: string;
|
||||
userID: string;
|
||||
|
|
Loading…
Reference in New Issue