From cf31cdd7969b51aa8270609561552d37424e1a8a Mon Sep 17 00:00:00 2001
From: barelyprofessional
<150058423+barelyprofessional@users.noreply.github.com>
Date: Sat, 21 Jun 2025 13:42:02 -0500
Subject: [PATCH] Money models
---
.../Models/DbModels/MoneyDbModels.cs | 168 ++++++++++++++++++
1 file changed, 168 insertions(+)
create mode 100644 KfChatDotNetBot/Models/DbModels/MoneyDbModels.cs
diff --git a/KfChatDotNetBot/Models/DbModels/MoneyDbModels.cs b/KfChatDotNetBot/Models/DbModels/MoneyDbModels.cs
new file mode 100644
index 0000000..e512a73
--- /dev/null
+++ b/KfChatDotNetBot/Models/DbModels/MoneyDbModels.cs
@@ -0,0 +1,168 @@
+using System.ComponentModel;
+
+namespace KfChatDotNetBot.Models.DbModels;
+
+public class GamblerDbModel
+{
+ ///
+ /// ID fo the database row
+ ///
+ public int Id { get; set; }
+ ///
+ /// User that this gambler entity is associated with.
+ /// A user can have multiple associated gambler entities, but only one should be active
+ ///
+ public required UserDbModel User { get; set; }
+ ///
+ /// Gambler's balance. It can be negative if an admin has forced them into an overdraft
+ /// Values are fractional, it is NOT stored as cents, therefore 100.00 KKK is stored as "100" in the database
+ ///
+ public required decimal Balance { get; set; }
+ ///
+ /// What state the gambler entity is in
+ ///
+ public required GamblerState State { get; set; } = GamblerState.Active;
+ ///
+ /// The seed value given to any instance of Random that's associated with the gambler
+ ///
+ public required string RandomSeed { get; set; }
+ ///
+ /// When the gambler entity was created
+ ///
+ public required DateTimeOffset Created { get; set; }
+}
+
+public class TransactionDbModel
+{
+ ///
+ /// ID fo the database row
+ ///
+ public int Id { get; set; }
+ ///
+ /// User whose balance was affected by this transaction
+ ///
+ public required GamblerDbModel User { get; set; }
+ ///
+ /// Source of the transaction event
+ ///
+ public required TransactionSourceEventType EventSource { get; set; }
+ ///
+ /// Time when the event occurred
+ ///
+ public required DateTimeOffset Time { get; set; }
+ ///
+ /// Effect of the transaction, plus or minus
+ ///
+ public required decimal Effect { get; set; }
+ ///
+ /// Optional descriptive comment for the transaction. e.g. "Win from wager [id]", "Balance adjustment by Avenue", "Juicer from Null", etc.
+ ///
+ public string? Comment { get; set; } = null;
+ ///
+ /// Sender of the transaction in the case of a juicer, null otherwise
+ ///
+ public GamblerDbModel? From { get; set; } = null;
+}
+
+public class WagerDbModel
+{
+ ///
+ /// ID fo the database row
+ ///
+ public int Id { get; set; }
+ ///
+ /// User who wagered
+ ///
+ public required GamblerDbModel User { get; set; }
+ ///
+ /// Time they wagered
+ ///
+ public required DateTimeOffset Time { get; set; }
+ ///
+ /// Amount the user wagered
+ ///
+ public required decimal WagerAmount { get; set; }
+ ///
+ /// Effect of the wager on the user's balance
+ ///
+ public required decimal WagerEffect { get; set; }
+ ///
+ /// Game they played to wager the amount (Note: enum must be extended for any new games.
+ /// Don't remove games which are legacy from the enum, just give them the Obsolete attribute)
+ ///
+ public required WagerGame Game { get; set; }
+ ///
+ /// Multiplier if applicable. 0 if it was a complete loss
+ ///
+ public required decimal Multiplier { get; set; }
+ ///
+ /// An optional field to store serialized information about the game that was played
+ ///
+ public string? GameMeta { get; set; } = null;
+}
+
+///
+/// What event triggered this transaction
+///
+public enum TransactionSourceEventType
+{
+ ///
+ /// Generic catch-all type if nothing else suits
+ ///
+ Other,
+ ///
+ /// Juice from another user. This is only for person to person transactions, use Bonus for kasino rewards
+ ///
+ Juicer,
+ ///
+ /// Transaction generated from the result of a wager
+ ///
+ Gambling,
+ ///
+ /// For recording events related to an administrative action. e.g. balance adjustments
+ ///
+ Administrative,
+ ///
+ /// Some type of bonus, like rakeback or a reload. Do not use for hostess rewards
+ ///
+ Bonus,
+ ///
+ /// Use this only for hostess juicers as the sum of these juicers in a given day can influence the hostess' behavior
+ ///
+ Hostess
+}
+
+public enum WagerGame
+{
+ Limbo,
+ Dice,
+ Mines,
+ Planes,
+ [Description("Lambchop")]
+ LambChop,
+ Keno,
+ [Description("Coinflip")]
+ CoinFlip
+}
+
+public enum GamblerState
+{
+ ///
+ /// Gambler entity is active and user can wager using the profile
+ ///
+ Active,
+ ///
+ /// Gambler entity has been disabled by an administrator (e.g. due to cheating)
+ /// The user will get a new gambler entity when they next interact with the kasino
+ ///
+ AdministrativelyDisabled,
+ ///
+ /// Gambler entity that was abandoned by the user (e.g. to escape an exclusion or crippling debt)
+ ///
+ Abandoned,
+ ///
+ /// Entity was permanently banned. This will prevent future gambler entities being created for this user
+ /// and will effectively lock them out of the game entirely
+ ///
+ PermanentlyBanned
+}
\ No newline at end of file