Created initial models for kasino events

This commit is contained in:
barelyprofessional
2025-11-16 02:03:02 -06:00
parent e99434f5df
commit 4bf9308fa7
3 changed files with 129 additions and 3 deletions

View File

@@ -289,7 +289,7 @@ public enum WagerGame
/// </summary>
Event,
[Description("Guess what number I'm thinking of")]
GuessWhatNumber
GuessWhatNumber,
}
public enum GamblerState

View File

@@ -1,3 +1,40 @@
namespace KfChatDotNetBot.Models;
// Stash all the models used for perk or game metadata here
// Stash all the models used for perk or game metadata here
public class KasinoWagerBaseEventMetaModel
{
/// <summary>
/// Event type for this meta model for the purposes of figuring out which model to use when deserializing
/// </summary>
public required KasinoEventType EventType { get; set; }
/// <summary>
/// Unique reference tracking the shared event ID stored in the settings
/// </summary>
public required string SharedEventId { get; set; }
/// <summary>
/// How long it took the user to make a selection. This is based on the event announcement msg recv - sent timestamp
/// that SneedChat provided so the bot won't unfairly penalize users who were delayed by chat lag
/// </summary>
public required TimeSpan SelectionDelay { get; set; }
}
/// <summary>
/// Metadata model tracking a gambler's wager information related to win/lose games specifically
/// </summary>
public class KasinoWagerWinLoseEventMetaModel : KasinoWagerBaseEventMetaModel
{
/// <summary>
/// Unique reference tracking the option the gambler selected. Tracked as a GUID in case the option text changes
/// </summary>
public required string OptionId { get; set; }
}
/// <summary>
/// Metadata model tracking a gambler's wager information related to win/lose games specifically
/// </summary>
public class KasinoWagerPredictionEventMetaModel : KasinoWagerBaseEventMetaModel
{
/// <summary>
/// The absolute time when the user predicted the thing was going to happen
/// </summary>
public required DateTimeOffset PredictedTime { get; set; }
}

View File

@@ -1,4 +1,4 @@
using KfChatDotNetBot.Models.DbModels;
using System.ComponentModel;
namespace KfChatDotNetBot.Models;
@@ -54,4 +54,93 @@ public class NextVipLevelModel
/// The wager requirement to reach this tier that factors in the tier
/// </summary>
public required decimal WagerRequirement { get; set; }
}
public class KasinoEventModel
{
/// <summary>
/// Text summary of the event itself such as: "How long until the chase ends?" or "Parole granted?"
/// </summary>
public required string EventText { get; set; }
/// <summary>
/// Unique reference used for tying this event to wagers gamblers are placing
/// </summary>
public required string EventId { get; set; }
/// <summary>
/// The set of options available for gamblers to select. This is only applicable to WinLose-type bets
/// It'll be an empty array for closest to finish
/// </summary>
public required List<KasinoEventOptionModel> Options { get; set; } = [];
/// <summary>
/// The type of event this is, which is important for the purposes of calculating the payout correctly
/// </summary>
public required KasinoEventType EventType { get; set; }
/// <summary>
/// Timestamp of when the announcement message was received by the client for the purposes of calculating selection
/// delay. This value is null when the message hasn't been seen yet (either event not started or message lost.
/// Do not accept wagers where this is null.
/// </summary>
public DateTimeOffset? EventAnnouncementReceived { get; set; } = null;
/// <summary>
/// State of the kasino event
/// </summary>
public required KasinoEventState EventState { get; set; } = KasinoEventState.Incomplete;
}
public class KasinoEventOptionModel
{
/// <summary>
/// Unique reference used for tying a gambler's selection to a given option
/// </summary>
public required string OptionId { get; set; }
/// <summary>
/// Text to describe the option that users are picking
/// </summary>
public required string OptionText { get; set; }
/// <summary>
/// Whether this option won or not, null while incomplete
/// </summary>
public bool? Won { get; set; } = null;
}
public enum KasinoEventType
{
[Description("Win/Lose")]
WinLose,
[Description("Closest to prediction")]
Prediction,
[Description("Closest to prediction (payout weighted to favor early bets)")]
PredictionSelectionTimeWeighted,
[Description("Win/Lose (payout weighted to favor early bets)")]
WinLoseSelectionTimeWeighted
}
public enum KasinoEventState
{
/// <summary>
/// Event still under construction. This is the initial state when an admin creates an event but hasn't yet launched it
/// </summary>
Incomplete,
/// <summary>
/// Event has been launched but the announcement message hasn't yet been acknowledged by Sneedchat
/// No bets will be processed until the message is seen
/// If the message is ultimately lost, the event will never launch
/// </summary>
PendingAnnouncement,
/// <summary>
/// The event announcement message was seen, the event has started and wagers can now be placed
/// </summary>
Started,
/// <summary>
/// Closed to new wagers but the event is still ongoing
/// </summary>
Closed,
/// <summary>
/// Event has closed, it's so over.
/// </summary>
Over,
/// <summary>
/// Event was abandoned and all wagers canceled
/// </summary>
Abandoned
}