mirror of
				https://github.com/keanuplayz/TravBot-v3.git
				synced 2024-08-15 02:33:12 +00:00 
			
		
		
		
	Add 'bet' command to the 'eco' module
This commit is contained in:
		
							parent
							
								
									8b29163c26
								
							
						
					
					
						commit
						7105c6284f
					
				
					 2 changed files with 140 additions and 1 deletions
				
			
		|  | @ -3,6 +3,7 @@ import {isAuthorized, getMoneyEmbed} from "./subcommands/eco-utils"; | ||||||
| import {DailyCommand, PayCommand, GuildCommand, LeaderboardCommand} from "./subcommands/eco-core"; | import {DailyCommand, PayCommand, GuildCommand, LeaderboardCommand} from "./subcommands/eco-core"; | ||||||
| import {BuyCommand, ShopCommand} from "./subcommands/eco-shop"; | import {BuyCommand, ShopCommand} from "./subcommands/eco-shop"; | ||||||
| import {MondayCommand} from "./subcommands/eco-extras"; | import {MondayCommand} from "./subcommands/eco-extras"; | ||||||
|  | import {BetCommand} from "./subcommands/eco-bet"; | ||||||
| 
 | 
 | ||||||
| export default new Command({ | export default new Command({ | ||||||
|     description: "Economy command for Monika.", |     description: "Economy command for Monika.", | ||||||
|  | @ -16,7 +17,8 @@ export default new Command({ | ||||||
|         leaderboard: LeaderboardCommand, |         leaderboard: LeaderboardCommand, | ||||||
|         buy: BuyCommand, |         buy: BuyCommand, | ||||||
|         shop: ShopCommand, |         shop: ShopCommand, | ||||||
|         monday: MondayCommand |         monday: MondayCommand, | ||||||
|  |         bet: BetCommand | ||||||
|     }, |     }, | ||||||
|     user: new Command({ |     user: new Command({ | ||||||
|         description: "See how much money someone else has by using their user ID or pinging them.", |         description: "See how much money someone else has by using their user ID or pinging them.", | ||||||
|  |  | ||||||
							
								
								
									
										137
									
								
								src/commands/fun/subcommands/eco-bet.ts
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										137
									
								
								src/commands/fun/subcommands/eco-bet.ts
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,137 @@ | ||||||
|  | import Command from "../../../core/command"; | ||||||
|  | import $ from "../../../core/lib"; | ||||||
|  | import {Storage} from "../../../core/structures"; | ||||||
|  | import {isAuthorized, getMoneyEmbed, getSendEmbed, ECO_EMBED_COLOR} from "./eco-utils"; | ||||||
|  | 
 | ||||||
|  | export const BetCommand = new Command({ | ||||||
|  |     description: "Bet your Mons with other people [TBD]", | ||||||
|  |     usage: "<user> <amount> <duration>", | ||||||
|  |     run: "Who are you betting with?", | ||||||
|  |     user: new Command({ | ||||||
|  |         run: "How much are you betting?", | ||||||
|  |         number: new Command({ | ||||||
|  |             run: "How long until the bet ends?", | ||||||
|  |             any: new Command({ | ||||||
|  |                 async run({ client, args, author, channel, guild}): Promise<any> { | ||||||
|  |                     if (isAuthorized(guild, channel)) { | ||||||
|  |                         const sender = Storage.getUser(author.id); | ||||||
|  |                         const target = args[0]; | ||||||
|  |                         const receiver = Storage.getUser(target); | ||||||
|  |                         const amount = Math.floor(args[1]); | ||||||
|  |                         const duration = parseDuration(args[2].trim()); | ||||||
|  | 
 | ||||||
|  |                         if (amount <= 0) return channel.send("You must bet at least one Mon!"); | ||||||
|  |                         else if (sender.money < amount) | ||||||
|  |                             return channel.send("You don't have enough Mons for that.", getMoneyEmbed(author)); | ||||||
|  |                         else if (target.id == author.id) return channel.send("You can't bet Mons with yourself!"); | ||||||
|  |                         else if (target.bot && process.argv[2] !== "dev") | ||||||
|  |                             return channel.send("You can't bet Mons with a bot!"); | ||||||
|  | 
 | ||||||
|  |                         if (duration <= 0) | ||||||
|  |                             return channel.send("Invalid duration"); | ||||||
|  |                         // else if (duration <= {threshold})
 | ||||||
|  |                         //     return channel.send("Too short idk");
 | ||||||
|  |                         // else if (duration >= {threshold})
 | ||||||
|  |                         //     return channel.send("Too long idk");
 | ||||||
|  | 
 | ||||||
|  |                         // SEND MESSAGE WITH 2 REACTIONS (OK / NO)
 | ||||||
|  |                         const msg = await channel.send(`<@${target.id}>, do you want to take this bet of ${$(amount).pluralise("Mon", "s")}`); | ||||||
|  |                         await msg.react("✅"); | ||||||
|  |                         await msg.react("⛔"); | ||||||
|  | 
 | ||||||
|  |                         // SET UP ACCEPT TIMEOUT
 | ||||||
|  |                         // ON REACTION CHANGE, CHECK IF NEW REACTION IS FROM TARGET
 | ||||||
|  |                         await msg.awaitReactions( | ||||||
|  |                             async (reaction, user) => { | ||||||
|  |                         //   IF OK
 | ||||||
|  |                                 if (user.id === target.id && reaction.emoji.name === "✅") { | ||||||
|  |                         //     REMOVE AMOUNT FROM AUTHOR
 | ||||||
|  |                                     sender.money -= amount; | ||||||
|  |                         //     REMOVE AMOUNT FROM TARGET
 | ||||||
|  |                                     receiver.money -= amount; | ||||||
|  |                         //     SET BET POOL AS AMOUNT*2
 | ||||||
|  |                         //     => BET POOL ALWAYS EVEN
 | ||||||
|  |                                     const pool = amount * 2; | ||||||
|  | 
 | ||||||
|  |                         //     SET UP BET TIMEOUT FROM DURATION
 | ||||||
|  |                                     client.setTimeout(async () => { | ||||||
|  |                         //     ON BET TIMEOUT
 | ||||||
|  |                         //       GIVE VOTE WITH 2 REACTIONS (OK / NO)
 | ||||||
|  |                                         const voteMsg = await channel.send(`VOTE: do you think that <@${target.id} has won the bet?`); | ||||||
|  |                                         await voteMsg.react("✅"); | ||||||
|  |                                         await voteMsg.react("⛔"); | ||||||
|  | 
 | ||||||
|  |                         //       SET UP VOTE TIMEOUT
 | ||||||
|  |                                         voteMsg.awaitReactions( | ||||||
|  |                                             (reaction, user) => { | ||||||
|  |                                                 return ["✅", "⛔"].includes(reaction.emoji.name); | ||||||
|  |                                             }, | ||||||
|  |                                             // waiting for a day for now, might need to make configurable
 | ||||||
|  |                                             { time: 8640000 } | ||||||
|  |                                         ).then(reactions => { | ||||||
|  |                         //       ON VOTE TIMEOUT
 | ||||||
|  |                         //         COUNT OK VOTES
 | ||||||
|  |                                             const ok = 0; | ||||||
|  |                         //         COUNT NO VOTES
 | ||||||
|  |                                             const no = 0; | ||||||
|  |                         //         IF OK > NO
 | ||||||
|  |                         //           GIVE TARGET THE BET POOL
 | ||||||
|  |                                             if (ok > no) receiver.money += pool; | ||||||
|  |                         //         ELSE IF OK < NO
 | ||||||
|  |                         //           GIVE AUTHOR BET POOL
 | ||||||
|  |                                             else if (ok < no) sender.money += pool; | ||||||
|  |                         //         ELSE
 | ||||||
|  |                         //           GIVE TARGET BET POOL / 2
 | ||||||
|  |                         //           GIVE AUTHOR BET POOL / 2
 | ||||||
|  |                         //           => BET EFFECT CANCELLED
 | ||||||
|  |                                             else { | ||||||
|  |                                                 sender.money += amount; | ||||||
|  |                                                 receiver.money += amount; | ||||||
|  |                                             } | ||||||
|  |                                         }); | ||||||
|  |                                     }, duration); | ||||||
|  |                                 } | ||||||
|  |                         //   IF NO
 | ||||||
|  |                         //     DROP
 | ||||||
|  |                                 return false; | ||||||
|  |                             }, | ||||||
|  |                             // waiting for a minute
 | ||||||
|  |                             { time: 60000 } | ||||||
|  |                         ); | ||||||
|  |                         // ON ACCEPT TIMEOUT
 | ||||||
|  |                         //   DROP
 | ||||||
|  |                     } | ||||||
|  |                 } | ||||||
|  |             }) | ||||||
|  |         }) | ||||||
|  |     }) | ||||||
|  | }); | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | /** | ||||||
|  |  * Parses a duration string into milliseconds | ||||||
|  |  * Examples: | ||||||
|  |  * - 3d -> 3 days -> 259200000ms | ||||||
|  |  * - 3s -> 3 seconds -> 3000ms | ||||||
|  |  * - 2h -> 2 hours -> 7200000ms | ||||||
|  |  */ | ||||||
|  | function parseDuration(duration: string): number { | ||||||
|  |     // extract last char as unit
 | ||||||
|  |     const unit = duration[duration.length - 1].toLowerCase(); | ||||||
|  |     // get the rest as value
 | ||||||
|  |     let value: number = +duration.substring(0, duration.length - 1); | ||||||
|  | 
 | ||||||
|  |     if (!["d","h","m","s"].includes(unit) || isNaN(value)) | ||||||
|  |         return 0; | ||||||
|  | 
 | ||||||
|  |     if (unit === "d") | ||||||
|  |         value *= 86400000; // 1000ms * 60s * 60m * 24h
 | ||||||
|  |     else if (unit === "h") | ||||||
|  |         value *= 3600000; // 1000ms * 60s * 60m
 | ||||||
|  |     else if (unit === "m") | ||||||
|  |         value *= 60000; // 1000ms * 60s
 | ||||||
|  |     else if (unit === "s") | ||||||
|  |         value *= 1000; // 1000ms
 | ||||||
|  | 
 | ||||||
|  |     return value; | ||||||
|  | } | ||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue