mirror of
https://github.com/Cog-Creators/Red-DiscordBot.git
synced 2025-11-06 11:18:54 -05:00
Mod commands are now logged into data/mod/mod.log Economy events are logged into data/economy/economy.log Added !bank set to set credits (admin/owner) Added !bank transfer to transfer credits between bank accounts Modified !bank balance, it can now show the balance of other users too
293 lines
13 KiB
Python
293 lines
13 KiB
Python
import discord
|
|
from discord.ext import commands
|
|
from .utils.dataIO import fileIO
|
|
from .utils import checks
|
|
from random import randint
|
|
from copy import deepcopy
|
|
from __main__ import send_cmd_help
|
|
import os
|
|
import time
|
|
import logging
|
|
|
|
slot_payouts = """Slot machine payouts:
|
|
:two: :two: :six: Bet * 5000
|
|
:four_leaf_clover: :four_leaf_clover: :four_leaf_clover: +1000
|
|
:cherries: :cherries: :cherries: +800
|
|
:two: :six: Bet * 4
|
|
:cherries: :cherries: Bet * 3
|
|
|
|
Three symbols: +500
|
|
Two symbols: Bet * 2"""
|
|
|
|
class Economy:
|
|
"""Economy
|
|
|
|
Get rich and have fun with imaginary currency!"""
|
|
|
|
def __init__(self, bot):
|
|
self.bot = bot
|
|
self.bank = fileIO("data/economy/bank.json", "load")
|
|
self.settings = fileIO("data/economy/settings.json", "load")
|
|
self.payday_register = {}
|
|
|
|
@commands.group(name="bank", pass_context=True)
|
|
async def _bank(self, ctx):
|
|
"""Bank operations"""
|
|
if ctx.invoked_subcommand is None:
|
|
await send_cmd_help(ctx)
|
|
|
|
@_bank.command(pass_context=True, no_pm=True)
|
|
async def register(self, ctx):
|
|
"""Registers an account at the Twentysix bank"""
|
|
user = ctx.message.author
|
|
if user.id not in self.bank:
|
|
self.bank[user.id] = {"name" : user.name, "balance" : 100}
|
|
fileIO("data/economy/bank.json", "save", self.bank)
|
|
await self.bot.say("{} Account opened. Current balance: {}".format(user.mention, str(self.check_balance(user.id))))
|
|
else:
|
|
await self.bot.say("{} You already have an account at the Twentysix bank.".format(user.mention))
|
|
|
|
@_bank.command(pass_context=True)
|
|
async def balance(self, ctx, user : discord.Member=None):
|
|
"""Shows balance of user.
|
|
|
|
Defaults to yours."""
|
|
if not user:
|
|
user = ctx.message.author
|
|
if self.account_check(user.id):
|
|
await self.bot.say("{} Your balance is: {}".format(user.mention, str(self.check_balance(user.id))))
|
|
else:
|
|
await self.bot.say("{} You don't have an account at the Twentysix bank. Type !register to open one.".format(user.mention, str(self.check_balance(user.id))))
|
|
else:
|
|
if self.account_check(user.id):
|
|
balance = self.check_balance(user.id)
|
|
await self.bot.say("{}'s balance is {}".format(user.name, str(balance)))
|
|
else:
|
|
await self.bot.say("That user has no bank account.")
|
|
|
|
@_bank.command(pass_context=True)
|
|
async def transfer(self, ctx, user : discord.Member, sum : int):
|
|
"""Transfer credits to other users"""
|
|
author = ctx.message.author
|
|
if author == user:
|
|
await self.bot.say("You can't transfer money to yourself.")
|
|
return
|
|
if self.account_check(user.id):
|
|
if self.enough_money(author.id, sum):
|
|
self.withdraw_money(author.id, sum)
|
|
self.add_money(user.id, sum)
|
|
logger.info("{}({}) transferred {} credits to {}({})".format(author.name, author.id, str(sum), user.name, user.id))
|
|
await self.bot.say("{} credits have been transferred to {}'s account.".format(str(sum), user.name))
|
|
else:
|
|
await self.bot.say("You don't have that sum in your bank account.")
|
|
else:
|
|
await self.bot.say("That user has no bank account.")
|
|
|
|
@_bank.command(name="set", pass_context=True)
|
|
@checks.admin_or_permissions(manage_server=True)
|
|
async def _set(self, ctx, user : discord.Member, sum : int):
|
|
"""Sets money of user's bank account
|
|
|
|
Admin/owner restricted."""
|
|
author = ctx.message.author
|
|
done = self.set_money(user.id, sum)
|
|
if done:
|
|
logger.info("{}({}) set {} credits to {} ({})".format(author.name, author.id, str(sum), user.name, user.id))
|
|
await self.bot.say("{}'s credits have been set to {}".format(user.name, str(sum)))
|
|
else:
|
|
await self.bot.say("User has no bank account.")
|
|
|
|
@commands.command(pass_context=True, no_pm=True)
|
|
async def payday(self, ctx):
|
|
"""Get some free credits"""
|
|
author = ctx.message.author
|
|
id = author.id
|
|
if self.account_check(id):
|
|
if id in self.payday_register:
|
|
if abs(self.payday_register[id] - int(time.perf_counter())) >= self.settings["PAYDAY_TIME"]:
|
|
self.add_money(id, self.settings["PAYDAY_CREDITS"])
|
|
self.payday_register[id] = int(time.perf_counter())
|
|
await self.bot.say("{} Here, take some credits. Enjoy! (+{} credits!)".format(author.mention, str(self.settings["PAYDAY_CREDITS"])))
|
|
else:
|
|
await self.bot.say("{} Too soon. You have to wait {} seconds between each payday.".format(author.mention, str(self.settings["PAYDAY_TIME"])))
|
|
else:
|
|
self.payday_register[id] = int(time.perf_counter())
|
|
self.add_money(id, self.settings["PAYDAY_CREDITS"])
|
|
await self.bot.say("{} Here, take some credits. Enjoy! (+{} credits!)".format(author.mention, str(self.settings["PAYDAY_CREDITS"])))
|
|
else:
|
|
await self.bot.say("{} You need an account to receive credits.".format(author.mention))
|
|
|
|
@commands.command(pass_context=True)
|
|
async def payouts(self, ctx):
|
|
"""Shows slot machine payouts"""
|
|
await self.bot.send_message(ctx.message.author, slot_payouts)
|
|
|
|
@commands.command(pass_context=True, no_pm=True)
|
|
async def slot(self, ctx, bid : int):
|
|
"""Play the slot machine"""
|
|
author = ctx.message.author
|
|
if self.enough_money(author.id, bid):
|
|
if bid >= self.settings["SLOT_MIN"] and bid <= self.settings["SLOT_MAX"]:
|
|
await self.slot_machine(ctx.message, bid)
|
|
else:
|
|
await self.bot.say("{0} Bid must be between {1} and {2}.".format(author.mention, self.settings["SLOT_MIN"], self.settings["SLOT_MAX"]))
|
|
else:
|
|
await self.bot.say("{0} You need an account with enough funds to play the slot machine.".format(author.mention))
|
|
|
|
async def slot_machine(self, message, bid):
|
|
reel_pattern = [":cherries:", ":cookie:", ":two:", ":four_leaf_clover:", ":cyclone:", ":sunflower:", ":six:", ":mushroom:", ":heart:", ":snowflake:"]
|
|
padding_before = [":mushroom:", ":heart:", ":snowflake:"] # padding prevents index errors
|
|
padding_after = [":cherries:", ":cookie:", ":two:"]
|
|
reel = padding_before + reel_pattern + padding_after
|
|
reels = []
|
|
for i in range(0, 3):
|
|
n = randint(3,12)
|
|
reels.append([reel[n - 1], reel[n], reel[n + 1]])
|
|
line = [reels[0][1], reels[1][1], reels[2][1]]
|
|
|
|
display_reels = " " + reels[0][0] + " " + reels[1][0] + " " + reels[2][0] + "\n"
|
|
display_reels += ">" + reels[0][1] + " " + reels[1][1] + " " + reels[2][1] + "\n"
|
|
display_reels += " " + reels[0][2] + " " + reels[1][2] + " " + reels[2][2] + "\n"
|
|
|
|
if line[0] == ":two:" and line[1] == ":two:" and line[2] == ":six:":
|
|
bid = bid * 5000
|
|
await self.bot.send_message(message.channel, "{}{} 226! Your bet is multiplied * 5000! {}! ".format(display_reels, message.author.mention, str(bid)))
|
|
elif line[0] == ":four_leaf_clover:" and line[1] == ":four_leaf_clover:" and line[2] == ":four_leaf_clover:":
|
|
bid += 1000
|
|
await self.bot.send_message(message.channel, "{}{} Three FLC! +1000! ".format(display_reels, message.author.mention))
|
|
elif line[0] == ":cherries:" and line[1] == ":cherries:" and line[2] == ":cherries:":
|
|
bid += 800
|
|
await self.bot.send_message(message.channel, "{}{} Three cherries! +800! ".format(display_reels, message.author.mention))
|
|
elif line[0] == line[1] == line[2]:
|
|
bid += 500
|
|
await self.bot.send_message(message.channel, "{}{} Three symbols! +500! ".format(display_reels, message.author.mention))
|
|
elif line[0] == ":two:" and line[1] == ":six:" or line[1] == ":two:" and line[2] == ":six:":
|
|
bid = bid * 4
|
|
await self.bot.send_message(message.channel, "{}{} 26! Your bet is multiplied * 4! {}! ".format(display_reels, message.author.mention, str(bid)))
|
|
elif line[0] == ":cherries:" and line[1] == ":cherries:" or line[1] == ":cherries:" and line[2] == ":cherries:":
|
|
bid = bid * 3
|
|
await self.bot.send_message(message.channel, "{}{} Two cherries! Your bet is multiplied * 3! {}! ".format(display_reels, message.author.mention, str(bid)))
|
|
elif line[0] == line[1] or line[1] == line[2]:
|
|
bid = bid * 2
|
|
await self.bot.send_message(message.channel, "{}{} Two symbols! Your bet is multiplied * 2! {}! ".format(display_reels, message.author.mention, str(bid)))
|
|
else:
|
|
await self.bot.send_message(message.channel, "{}{} Nothing! Lost bet. ".format(display_reels, message.author.mention))
|
|
self.withdraw_money(message.author.id, bid)
|
|
await self.bot.send_message(message.channel, "Credits left: {}".format(str(self.check_balance(message.author.id))))
|
|
return True
|
|
self.add_money(message.author.id, bid)
|
|
await self.bot.send_message(message.channel, "Current credits: {}".format(str(self.check_balance(message.author.id))))
|
|
|
|
@commands.group(pass_context=True, no_pm=True)
|
|
@checks.admin_or_permissions(manage_server=True)
|
|
async def economyset(self, ctx):
|
|
"""Changes economy module settings"""
|
|
if ctx.invoked_subcommand is None:
|
|
msg = ""
|
|
for k, v in self.settings.items():
|
|
msg += str(k) + ": " + str(v) + "\n"
|
|
msg += "\nType help economyset to see the list of commands."
|
|
await self.bot.say(msg)
|
|
|
|
@economyset.command()
|
|
async def slotmin(self, bid : int):
|
|
"""Minimum slot machine bid"""
|
|
self.settings["SLOT_MIN"] = bid
|
|
await self.bot.say("Minimum bid is now " + str(bid) + " credits.")
|
|
fileIO("data/economy/settings.json", "save", self.settings)
|
|
|
|
@economyset.command()
|
|
async def slotmax(self, bid : int):
|
|
"""Maximum slot machine bid"""
|
|
self.settings["SLOT_MAX"] = bid
|
|
await self.bot.say("Maximum bid is now " + str(bid) + " credits.")
|
|
fileIO("data/economy/settings.json", "save", self.settings)
|
|
|
|
@economyset.command()
|
|
async def paydaytime(self, seconds : int):
|
|
"""Seconds between each payday"""
|
|
self.settings["PAYDAY_TIME"] = seconds
|
|
await self.bot.say("Value modified. At least " + str(seconds) + " seconds must pass between each payday.")
|
|
fileIO("data/economy/settings.json", "save", self.settings)
|
|
|
|
@economyset.command()
|
|
async def paydaycredits(self, credits : int):
|
|
"""Credits earned each payday"""
|
|
self.settings["PAYDAY_CREDITS"] = credits
|
|
await self.bot.say("Every payday will now give " + str(credits) + " credits.")
|
|
fileIO("data/economy/settings.json", "save", self.settings)
|
|
|
|
def account_check(self, id):
|
|
if id in self.bank:
|
|
return True
|
|
else:
|
|
return False
|
|
|
|
def check_balance(self, id):
|
|
if self.account_check(id):
|
|
return self.bank[id]["balance"]
|
|
else:
|
|
return False
|
|
|
|
def add_money(self, id, amount):
|
|
if self.account_check(id):
|
|
self.bank[id]["balance"] = self.bank[id]["balance"] + int(amount)
|
|
fileIO("data/economy/bank.json", "save", self.bank)
|
|
else:
|
|
return False
|
|
|
|
def withdraw_money(self, id, amount):
|
|
if self.account_check(id):
|
|
if self.bank[id]["balance"] >= int(amount):
|
|
self.bank[id]["balance"] = self.bank[id]["balance"] - int(amount)
|
|
fileIO("data/economy/bank.json", "save", self.bank)
|
|
else:
|
|
return False
|
|
else:
|
|
return False
|
|
|
|
def enough_money(self, id, amount):
|
|
if self.account_check(id):
|
|
if self.bank[id]["balance"] >= int(amount):
|
|
return True
|
|
else:
|
|
return False
|
|
else:
|
|
return False
|
|
|
|
def set_money(self, id, amount):
|
|
if self.account_check(id):
|
|
self.bank[id]["balance"] = amount
|
|
fileIO("data/economy/bank.json", "save", self.bank)
|
|
return True
|
|
else:
|
|
return False
|
|
|
|
def check_folders():
|
|
if not os.path.exists("data/economy"):
|
|
print("Creating data/economy folder...")
|
|
os.makedirs("data/economy")
|
|
|
|
def check_files():
|
|
settings = {"PAYDAY_TIME" : 300, "PAYDAY_CREDITS" : 120, "SLOT_MIN" : 5, "SLOT_MAX" : 100}
|
|
|
|
f = "data/economy/settings.json"
|
|
if not fileIO(f, "check"):
|
|
print("Creating default economy's settings.json...")
|
|
fileIO(f, "save", settings)
|
|
|
|
f = "data/economy/bank.json"
|
|
if not fileIO(f, "check"):
|
|
print("Creating empty bank.json...")
|
|
fileIO(f, "save", {})
|
|
|
|
def setup(bot):
|
|
global logger
|
|
check_folders()
|
|
check_files()
|
|
logger = logging.getLogger("economy")
|
|
logger.setLevel(logging.INFO)
|
|
handler = logging.FileHandler(filename='data/economy/economy.log', encoding='utf-8', mode='a')
|
|
handler.setFormatter(logging.Formatter('%(asctime)s %(message)s', datefmt="[%d/%m/%Y %H:%M]"))
|
|
logger.addHandler(handler)
|
|
bot.add_cog(Economy(bot)) |