229 lines
9.8 KiB
C#
229 lines
9.8 KiB
C#
using Discord;
|
|
using Discord.Commands;
|
|
using NadekoBot.Attributes;
|
|
using NadekoBot.Extensions;
|
|
using System;
|
|
using System.Linq;
|
|
using System.Text;
|
|
using System.Threading.Tasks;
|
|
using NadekoBot.Services;
|
|
using Discord.WebSocket;
|
|
using NadekoBot.Services.Database;
|
|
using NadekoBot.Services.Database.Models;
|
|
using System.Collections.Generic;
|
|
|
|
namespace NadekoBot.Modules.Gambling
|
|
{
|
|
[NadekoModule("Gambling", "$")]
|
|
public partial class Gambling : DiscordModule
|
|
{
|
|
public static string CurrencyName { get; set; }
|
|
public static string CurrencyPluralName { get; set; }
|
|
public static string CurrencySign { get; set; }
|
|
|
|
public Gambling(ILocalization loc, CommandService cmds, ShardedDiscordClient client) : base(loc, cmds, client)
|
|
{
|
|
using (var uow = DbHandler.UnitOfWork())
|
|
{
|
|
var conf = uow.BotConfig.GetOrCreate();
|
|
|
|
CurrencyName = conf.CurrencyName;
|
|
CurrencySign = conf.CurrencySign;
|
|
CurrencyPluralName = conf.CurrencyPluralName;
|
|
}
|
|
}
|
|
|
|
[NadekoCommand, Usage, Description, Aliases]
|
|
[RequireContext(ContextType.Guild)]
|
|
public async Task Raffle(IUserMessage umsg, [Remainder] IRole role = null)
|
|
{
|
|
var channel = (ITextChannel)umsg.Channel;
|
|
|
|
role = role ?? channel.Guild.EveryoneRole;
|
|
|
|
var members = role.Members().Where(u => u.Status == UserStatus.Online);
|
|
var membersArray = members as IUser[] ?? members.ToArray();
|
|
var usr = membersArray[new NadekoRandom().Next(0, membersArray.Length)];
|
|
await channel.SendMessageAsync($"**Raffled user:** {usr.Username} (id: {usr.Id})").ConfigureAwait(false);
|
|
}
|
|
|
|
[NadekoCommand, Usage, Description, Aliases]
|
|
[Priority(1)]
|
|
public async Task Cash(IUserMessage umsg, [Remainder] IUser user = null)
|
|
{
|
|
var channel = umsg.Channel;
|
|
|
|
user = user ?? umsg.Author;
|
|
long amount;
|
|
BotConfig config;
|
|
using (var uow = DbHandler.UnitOfWork())
|
|
{
|
|
amount = uow.Currency.GetUserCurrency(user.Id);
|
|
config = uow.BotConfig.GetOrCreate();
|
|
}
|
|
|
|
await channel.SendMessageAsync($"{user.Username} has {amount} {config.CurrencySign}").ConfigureAwait(false);
|
|
}
|
|
|
|
[NadekoCommand, Usage, Description, Aliases]
|
|
[Priority(0)]
|
|
public async Task Cash(IUserMessage umsg, ulong userId)
|
|
{
|
|
var channel = umsg.Channel;
|
|
|
|
long amount;
|
|
BotConfig config;
|
|
using (var uow = DbHandler.UnitOfWork())
|
|
{
|
|
amount = uow.Currency.GetUserCurrency(userId);
|
|
config = uow.BotConfig.GetOrCreate();
|
|
}
|
|
|
|
await channel.SendMessageAsync($"`{userId}` has {amount} {config.CurrencySign}").ConfigureAwait(false);
|
|
}
|
|
|
|
[NadekoCommand, Usage, Description, Aliases]
|
|
[RequireContext(ContextType.Guild)]
|
|
public async Task Give(IUserMessage umsg, long amount, [Remainder] IGuildUser receiver)
|
|
{
|
|
var channel = (ITextChannel)umsg.Channel;
|
|
if (amount <= 0)
|
|
return;
|
|
var success = await CurrencyHandler.RemoveCurrencyAsync((IGuildUser)umsg.Author, $"Gift to {receiver.Username} ({receiver.Id}).", amount, true).ConfigureAwait(false);
|
|
if (!success)
|
|
{
|
|
await channel.SendMessageAsync($"{umsg.Author.Mention} You don't have enough {Gambling.CurrencyPluralName}.").ConfigureAwait(false);
|
|
return;
|
|
}
|
|
await CurrencyHandler.AddCurrencyAsync(receiver, $"Gift from {umsg.Author.Username} ({umsg.Author.Id}).", amount, true).ConfigureAwait(false);
|
|
await channel.SendMessageAsync($"{umsg.Author.Mention} successfully sent {amount} {Gambling.CurrencyPluralName}s to {receiver.Mention}!").ConfigureAwait(false);
|
|
}
|
|
|
|
[NadekoCommand, Usage, Description, Aliases]
|
|
[RequireContext(ContextType.Guild)]
|
|
[OwnerOnly]
|
|
public Task Award(IUserMessage umsg, long amount, [Remainder] IGuildUser usr) =>
|
|
Award(umsg, amount, usr.Id);
|
|
|
|
[NadekoCommand, Usage, Description, Aliases]
|
|
[RequireContext(ContextType.Guild)]
|
|
[OwnerOnly]
|
|
public async Task Award(IUserMessage umsg, long amount, [Remainder] ulong usrId)
|
|
{
|
|
var channel = (ITextChannel)umsg.Channel;
|
|
|
|
if (amount <= 0)
|
|
return;
|
|
|
|
await CurrencyHandler.AddCurrencyAsync(usrId, $"Awarded by bot owner. ({umsg.Author.Username}/{umsg.Author.Id})", (int)amount).ConfigureAwait(false);
|
|
|
|
await channel.SendMessageAsync($"{umsg.Author.Mention} successfully awarded {amount} {Gambling.CurrencyName}s to <@{usrId}>!").ConfigureAwait(false);
|
|
}
|
|
|
|
[NadekoCommand, Usage, Description, Aliases]
|
|
[RequireContext(ContextType.Guild)]
|
|
[OwnerOnly]
|
|
public async Task Take(IUserMessage umsg, long amount, [Remainder] IGuildUser user)
|
|
{
|
|
var channel = (ITextChannel)umsg.Channel;
|
|
if (amount <= 0)
|
|
return;
|
|
|
|
if(await CurrencyHandler.RemoveCurrencyAsync(user, $"Taken by bot owner.({umsg.Author.Username}/{umsg.Author.Id})", amount, true).ConfigureAwait(false))
|
|
await channel.SendMessageAsync($"{umsg.Author.Mention} successfully took {amount} {Gambling.CurrencyPluralName} from {user}!").ConfigureAwait(false);
|
|
else
|
|
await channel.SendMessageAsync($"{umsg.Author.Mention} was unable to take {amount} {Gambling.CurrencyPluralName} from {user} because the user doesn't have that much {Gambling.CurrencyPluralName}!").ConfigureAwait(false);
|
|
}
|
|
|
|
|
|
[NadekoCommand, Usage, Description, Aliases]
|
|
[RequireContext(ContextType.Guild)]
|
|
[OwnerOnly]
|
|
public async Task Take(IUserMessage umsg, long amount, [Remainder] ulong usrId)
|
|
{
|
|
var channel = (ITextChannel)umsg.Channel;
|
|
if (amount <= 0)
|
|
return;
|
|
|
|
if(await CurrencyHandler.RemoveCurrencyAsync(usrId, $"Taken by bot owner.({umsg.Author.Username}/{umsg.Author.Id})", amount).ConfigureAwait(false))
|
|
await channel.SendMessageAsync($"{umsg.Author.Mention} successfully took {amount} {Gambling.CurrencyName}s from <@{usrId}>!").ConfigureAwait(false);
|
|
else
|
|
await channel.SendMessageAsync($"{umsg.Author.Mention} was unable to take {amount} {Gambling.CurrencyPluralName} from `{usrId}` because the user doesn't have that much {Gambling.CurrencyPluralName}!").ConfigureAwait(false);
|
|
}
|
|
|
|
[NadekoCommand, Usage, Description, Aliases]
|
|
[RequireContext(ContextType.Guild)]
|
|
public async Task BetRoll(IUserMessage umsg, long amount)
|
|
{
|
|
var channel = (ITextChannel)umsg.Channel;
|
|
|
|
if (amount < 1)
|
|
return;
|
|
|
|
var guildUser = (IGuildUser)umsg.Author;
|
|
|
|
long userFlowers;
|
|
using (var uow = DbHandler.UnitOfWork())
|
|
{
|
|
userFlowers = uow.Currency.GetOrCreate(umsg.Author.Id).Amount;
|
|
}
|
|
|
|
if (userFlowers < amount)
|
|
{
|
|
await channel.SendMessageAsync($"{guildUser.Mention} You don't have enough {Gambling.CurrencyPluralName}. You only have {userFlowers}{Gambling.CurrencySign}.").ConfigureAwait(false);
|
|
return;
|
|
}
|
|
|
|
await CurrencyHandler.RemoveCurrencyAsync(guildUser, "Betroll Gamble", amount, false).ConfigureAwait(false);
|
|
|
|
var rng = new NadekoRandom().Next(0, 101);
|
|
var str = $"{guildUser.Mention} `You rolled {rng}.` ";
|
|
if (rng < 67)
|
|
{
|
|
str += "More luck next time.";
|
|
}
|
|
else if (rng < 90)
|
|
{
|
|
str += $"Congratulations! You won {amount * 2}{Gambling.CurrencySign} for rolling above 66";
|
|
await CurrencyHandler.AddCurrencyAsync(guildUser, "Betroll Gamble", amount * 2, false).ConfigureAwait(false);
|
|
}
|
|
else if (rng < 100)
|
|
{
|
|
str += $"Congratulations! You won {amount * 3}{Gambling.CurrencySign} for rolling above 90.";
|
|
await CurrencyHandler.AddCurrencyAsync(guildUser, "Betroll Gamble", amount * 3, false).ConfigureAwait(false);
|
|
}
|
|
else
|
|
{
|
|
str += $"👑 Congratulations! You won {amount * 10}{Gambling.CurrencySign} for rolling **100**. 👑";
|
|
await CurrencyHandler.AddCurrencyAsync(guildUser, "Betroll Gamble", amount * 10, false).ConfigureAwait(false);
|
|
}
|
|
|
|
await channel.SendMessageAsync(str).ConfigureAwait(false);
|
|
}
|
|
|
|
[NadekoCommand, Usage, Description, Aliases]
|
|
[RequireContext(ContextType.Guild)]
|
|
public async Task Leaderboard(IUserMessage umsg)
|
|
{
|
|
var channel = (ITextChannel)umsg.Channel;
|
|
|
|
IEnumerable<Currency> richest;
|
|
using (var uow = DbHandler.UnitOfWork())
|
|
{
|
|
richest = uow.Currency.GetTopRichest(10);
|
|
}
|
|
if (!richest.Any())
|
|
return;
|
|
await channel.SendMessageAsync(
|
|
richest.Aggregate(new StringBuilder(
|
|
$@"```xl
|
|
┏━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━┓
|
|
┃ Id ┃ $$$ ┃
|
|
"),
|
|
(cur, cs) => cur.AppendLine($@"┣━━━━━━━━━━━━━━━━━━━━━╋━━━━━━━━┫
|
|
┃{(channel.Guild.GetUser(cs.UserId)?.Username.TrimTo(18, true) ?? cs.UserId.ToString()),-20} ┃ {cs.Amount,6} ┃")
|
|
).ToString() + "┗━━━━━━━━━━━━━━━━━━━━━┻━━━━━━━━┛```").ConfigureAwait(false);
|
|
}
|
|
}
|
|
}
|