2016-03-25 11:48:22 +00:00
using Discord ;
using Discord.Commands ;
using Discord.Modules ;
2016-03-26 02:25:03 +00:00
using NadekoBot.Classes ;
2016-05-11 09:37:19 +00:00
using NadekoBot.DataModels ;
2016-03-25 11:48:22 +00:00
using NadekoBot.Extensions ;
2016-07-25 02:21:37 +00:00
using NadekoBot.Modules.Gambling.Commands ;
2016-04-14 22:17:29 +00:00
using NadekoBot.Modules.Permissions.Classes ;
2016-03-26 02:25:03 +00:00
using System ;
2016-03-25 11:48:22 +00:00
using System.Linq ;
2016-05-11 09:37:19 +00:00
using System.Text ;
2016-03-25 11:48:22 +00:00
namespace NadekoBot.Modules.Gambling
{
internal class GamblingModule : DiscordModule
{
public GamblingModule ( )
{
commands . Add ( new DrawCommand ( this ) ) ;
commands . Add ( new FlipCoinCommand ( this ) ) ;
commands . Add ( new DiceRollCommand ( this ) ) ;
2016-07-25 02:21:37 +00:00
commands . Add ( new AnimalRacing ( this ) ) ;
2016-03-25 11:48:22 +00:00
}
public override string Prefix { get ; } = NadekoBot . Config . CommandPrefixes . Gambling ;
public override void Install ( ModuleManager manager )
{
manager . CreateCommands ( "" , cgb = >
{
2016-04-14 22:17:29 +00:00
cgb . AddCheck ( PermissionChecker . Instance ) ;
2016-03-25 11:48:22 +00:00
commands . ForEach ( com = > com . Init ( cgb ) ) ;
cgb . CreateCommand ( Prefix + "raffle" )
2016-07-28 20:26:05 +00:00
. Description ( $"Prints a name and ID of a random user from the online list from the (optional) role. | `{Prefix}raffle` or `{Prefix}raffle RoleName`" )
2016-03-26 02:25:03 +00:00
. Parameter ( "role" , ParameterType . Optional )
2016-05-11 10:48:50 +00:00
. Do ( async e = >
{
var arg = string . IsNullOrWhiteSpace ( e . GetArg ( "role" ) ) ? "@everyone" : e . GetArg ( "role" ) ;
var role = e . Server . FindRoles ( arg ) . FirstOrDefault ( ) ;
if ( role = = null )
{
await e . Channel . SendMessage ( "💢 Role not found." ) . ConfigureAwait ( false ) ;
return ;
}
var members = role . Members . Where ( u = > u . Status = = UserStatus . Online ) ; // only online
var membersArray = members as User [ ] ? ? members . ToArray ( ) ;
var usr = membersArray [ new Random ( ) . Next ( 0 , membersArray . Length ) ] ;
await e . Channel . SendMessage ( $"**Raffled user:** {usr.Name} (id: {usr.Id})" ) . ConfigureAwait ( false ) ;
} ) ;
2016-03-30 10:46:02 +00:00
2016-03-25 11:48:22 +00:00
cgb . CreateCommand ( Prefix + "$$" )
2016-07-11 16:17:41 +00:00
. Description ( string . Format ( "Check how much {0}s a person has. (Defaults to yourself) |`{1}$$` or `{1}$$ @Someone`" ,
2016-05-13 17:30:11 +00:00
NadekoBot . Config . CurrencyName , Prefix ) )
2016-05-11 10:48:50 +00:00
. Parameter ( "all" , ParameterType . Unparsed )
. Do ( async e = >
{
var usr = e . Message . MentionedUsers . FirstOrDefault ( ) ? ? e . User ;
2016-07-29 23:21:48 +00:00
var pts = GetUserFlowers ( usr . Id ) ;
2016-05-11 10:48:50 +00:00
var str = $"{usr.Name} has {pts} {NadekoBot.Config.CurrencySign}" ;
await e . Channel . SendMessage ( str ) . ConfigureAwait ( false ) ;
} ) ;
2016-03-30 10:46:02 +00:00
2016-03-26 02:25:03 +00:00
cgb . CreateCommand ( Prefix + "give" )
2016-07-29 23:21:48 +00:00
. Description ( string . Format ( "Give someone a certain amount of {0}s" , NadekoBot . Config . CurrencyName ) + $"|`{Prefix}give 1 \" @SomeGuy \ "`" )
2016-03-26 02:25:03 +00:00
. Parameter ( "amount" , ParameterType . Required )
. Parameter ( "receiver" , ParameterType . Unparsed )
. Do ( async e = >
{
var amountStr = e . GetArg ( "amount" ) ? . Trim ( ) ;
long amount ;
2016-07-17 19:29:58 +00:00
if ( ! long . TryParse ( amountStr , out amount ) | | amount < = 0 )
2016-03-26 02:25:03 +00:00
return ;
var mentionedUser = e . Message . MentionedUsers . FirstOrDefault ( u = >
u . Id ! = NadekoBot . Client . CurrentUser . Id & &
u . Id ! = e . User . Id ) ;
if ( mentionedUser = = null )
return ;
2016-07-29 23:21:48 +00:00
var userFlowers = GetUserFlowers ( e . User . Id ) ;
2016-03-26 02:25:03 +00:00
if ( userFlowers < amount )
{
2016-07-17 10:34:44 +00:00
await e . Channel . SendMessage ( $"{e.User.Mention} You don't have enough {NadekoBot.Config.CurrencyName}s. You only have {userFlowers}{NadekoBot.Config.CurrencySign}." ) . ConfigureAwait ( false ) ;
2016-03-26 02:25:03 +00:00
return ;
}
2016-07-17 12:11:46 +00:00
await FlowersHandler . RemoveFlowers ( e . User , "Gift" , ( int ) amount , true ) . ConfigureAwait ( false ) ;
2016-04-18 21:38:19 +00:00
await FlowersHandler . AddFlowersAsync ( mentionedUser , "Gift" , ( int ) amount ) . ConfigureAwait ( false ) ;
2016-03-26 02:25:03 +00:00
2016-04-18 21:38:19 +00:00
await e . Channel . SendMessage ( $"{e.User.Mention} successfully sent {amount} {NadekoBot.Config.CurrencyName}s to {mentionedUser.Mention}!" ) . ConfigureAwait ( false ) ;
2016-03-26 02:25:03 +00:00
} ) ;
2016-03-30 10:46:02 +00:00
cgb . CreateCommand ( Prefix + "award" )
2016-07-26 01:39:14 +00:00
. Description ( $"Gives someone a certain amount of flowers. **Bot Owner Only!** | `{Prefix}award 100 @person`" )
2016-04-14 22:17:29 +00:00
. AddCheck ( SimpleCheckers . OwnerOnly ( ) )
2016-03-30 10:46:02 +00:00
. Parameter ( "amount" , ParameterType . Required )
. Parameter ( "receiver" , ParameterType . Unparsed )
. Do ( async e = >
{
var amountStr = e . GetArg ( "amount" ) ? . Trim ( ) ;
long amount ;
if ( ! long . TryParse ( amountStr , out amount ) | | amount < 0 )
return ;
var mentionedUser = e . Message . MentionedUsers . FirstOrDefault ( u = >
u . Id ! = NadekoBot . Client . CurrentUser . Id ) ;
if ( mentionedUser = = null )
return ;
2016-04-18 21:38:19 +00:00
await FlowersHandler . AddFlowersAsync ( mentionedUser , $"Awarded by bot owner. ({e.User.Name}/{e.User.Id})" , ( int ) amount ) . ConfigureAwait ( false ) ;
2016-03-30 10:46:02 +00:00
2016-04-18 21:38:19 +00:00
await e . Channel . SendMessage ( $"{e.User.Mention} successfully awarded {amount} {NadekoBot.Config.CurrencyName}s to {mentionedUser.Mention}!" ) . ConfigureAwait ( false ) ;
2016-03-30 10:46:02 +00:00
} ) ;
cgb . CreateCommand ( Prefix + "take" )
2016-07-26 01:58:11 +00:00
. Description ( $"Takes a certain amount of flowers from someone. **Bot Owner Only!** | `{Prefix}take 1 \" @someguy \ "`" )
2016-04-14 22:17:29 +00:00
. AddCheck ( SimpleCheckers . OwnerOnly ( ) )
2016-03-30 10:46:02 +00:00
. Parameter ( "amount" , ParameterType . Required )
. Parameter ( "rektperson" , ParameterType . Unparsed )
. Do ( async e = >
{
var amountStr = e . GetArg ( "amount" ) ? . Trim ( ) ;
long amount ;
if ( ! long . TryParse ( amountStr , out amount ) | | amount < 0 )
return ;
var mentionedUser = e . Message . MentionedUsers . FirstOrDefault ( u = >
u . Id ! = NadekoBot . Client . CurrentUser . Id ) ;
if ( mentionedUser = = null )
return ;
2016-07-17 10:34:44 +00:00
await FlowersHandler . RemoveFlowers ( mentionedUser , $"Taken by bot owner.({e.User.Name}/{e.User.Id})" , ( int ) amount ) . ConfigureAwait ( false ) ;
2016-03-30 10:46:02 +00:00
2016-04-18 21:38:19 +00:00
await e . Channel . SendMessage ( $"{e.User.Mention} successfully took {amount} {NadekoBot.Config.CurrencyName}s from {mentionedUser.Mention}!" ) . ConfigureAwait ( false ) ;
2016-03-30 10:46:02 +00:00
} ) ;
2016-05-11 09:37:19 +00:00
2016-07-17 10:34:44 +00:00
cgb . CreateCommand ( Prefix + "betroll" )
. Alias ( Prefix + "br" )
2016-07-28 20:26:05 +00:00
. Description ( $"Bets a certain amount of {NadekoBot.Config.CurrencyName}s and rolls a dice. Rolling over 66 yields x2 flowers, over 90 - x3 and 100 x10. | `{Prefix}br 5`" )
2016-07-29 23:21:48 +00:00
. Parameter ( "amount" , ParameterType . Required )
2016-07-17 10:34:44 +00:00
. Do ( async e = >
{
var amountstr = e . GetArg ( "amount" ) . Trim ( ) ;
int amount ;
if ( ! int . TryParse ( amountstr , out amount ) | | amount < 1 )
return ;
2016-07-29 23:21:48 +00:00
var userFlowers = GetUserFlowers ( e . User . Id ) ;
2016-07-17 10:34:44 +00:00
if ( userFlowers < amount )
{
await e . Channel . SendMessage ( $"{e.User.Mention} You don't have enough {NadekoBot.Config.CurrencyName}s. You only have {userFlowers}{NadekoBot.Config.CurrencySign}." ) . ConfigureAwait ( false ) ;
return ;
}
2016-07-17 12:09:16 +00:00
await FlowersHandler . RemoveFlowers ( e . User , "Betroll Gamble" , ( int ) amount , true ) . ConfigureAwait ( false ) ;
2016-07-17 10:34:44 +00:00
var rng = new Random ( ) . Next ( 0 , 101 ) ;
var str = $"{e.User.Mention} `You rolled {rng}.` " ;
if ( rng < 67 )
{
str + = "Better luck next time." ;
}
else if ( rng < 90 )
{
str + = $"Congratulations! You won {amount * 2}{NadekoBot.Config.CurrencySign} for rolling above 66" ;
2016-07-17 12:09:16 +00:00
await FlowersHandler . AddFlowersAsync ( e . User , "Betroll Gamble" , amount * 2 , true ) . ConfigureAwait ( false ) ;
2016-07-17 10:34:44 +00:00
}
else if ( rng < 100 )
{
str + = $"Congratulations! You won {amount * 3}{NadekoBot.Config.CurrencySign} for rolling above 90." ;
2016-07-17 12:09:16 +00:00
await FlowersHandler . AddFlowersAsync ( e . User , "Betroll Gamble" , amount * 3 , true ) . ConfigureAwait ( false ) ;
2016-07-17 10:34:44 +00:00
}
2016-07-29 23:21:48 +00:00
else {
2016-07-17 10:34:44 +00:00
str + = $"👑 Congratulations! You won {amount * 10}{NadekoBot.Config.CurrencySign} for rolling **100**. 👑" ;
2016-07-17 12:09:16 +00:00
await FlowersHandler . AddFlowersAsync ( e . User , "Betroll Gamble" , amount * 10 , true ) . ConfigureAwait ( false ) ;
2016-07-17 10:34:44 +00:00
}
2016-07-17 12:09:16 +00:00
await e . Channel . SendMessage ( str ) . ConfigureAwait ( false ) ;
2016-07-29 23:21:48 +00:00
2016-07-17 10:34:44 +00:00
} ) ;
2016-05-11 09:37:19 +00:00
cgb . CreateCommand ( Prefix + "leaderboard" )
. Alias ( Prefix + "lb" )
2016-07-28 20:26:05 +00:00
. Description ( $"Displays bot currency leaderboard | {Prefix}lb" )
2016-05-11 09:37:19 +00:00
. Do ( async e = >
{
2016-07-29 23:21:48 +00:00
var richestTemp = DbHandler . Instance . GetTopRichest ( ) ;
2016-05-11 09:37:19 +00:00
var richest = richestTemp as CurrencyState [ ] ? ? richestTemp . ToArray ( ) ;
if ( richest . Length = = 0 )
return ;
await e . Channel . SendMessage (
richest . Aggregate ( new StringBuilder (
2016-07-11 09:44:33 +00:00
$ @ "```xl
┏ ━ ━ ━ ━ ━ ━ ━ ━ ━ ━ ━ ━ ━ ━ ━ ━ ━ ━ ━ ━ ━ ┳ ━ ━ ━ ━ ━ ━ ━ ┓
┃ Id ┃ $ $ $ ┃
2016-05-11 09:37:19 +00:00
"),
( cur , cs ) = > cur . AppendLine (
2016-07-11 09:44:33 +00:00
$ @ "┣━━━━━━━━━━━━━━━━━━━━━╋━━━━━━━┫
┃ { ( e . Server . Users . Where ( u = > u . Id = = ( ulong ) cs . UserId ) . FirstOrDefault ( ) ? . Name . TrimTo ( 18 , true ) ? ? cs . UserId . ToString ( ) ) , - 20 } ┃ { cs . Value , 5 } ┃ ")
2016-07-17 10:34:44 +00:00
) . ToString ( ) + "┗━━━━━━━━━━━━━━━━━━━━━┻━━━━━━━┛```" ) . ConfigureAwait ( false ) ;
2016-05-11 09:37:19 +00:00
} ) ;
2016-03-25 11:48:22 +00:00
} ) ;
}
2016-07-29 23:21:48 +00:00
public static long GetUserFlowers ( ulong userId ) = >
Classes . DbHandler . Instance . GetStateByUserId ( ( long ) userId ) ? . Value ? ? 0 ;
2016-03-25 11:48:22 +00:00
}
}