-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathProgram.cs
More file actions
89 lines (75 loc) · 3.48 KB
/
Program.cs
File metadata and controls
89 lines (75 loc) · 3.48 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
using tsgsBot_C_.StateServices;
using Discord.Interactions;
using tsgsBot_C_.Services;
using Discord.WebSocket;
using tsgsBot_C_.Bot;
using tsgsBot_C_;
using Discord;
Console.OutputEncoding = System.Text.Encoding.UTF8;
WebApplicationBuilder builder = WebApplication.CreateBuilder(args);
// ────────────────────────────────────────
// 1. Discord & bot services
// ────────────────────────────────────────
builder.Services.AddSingleton<DiscordSocketClient>(sp =>
{
DiscordSocketConfig config = new DiscordSocketConfig
{
GatewayIntents = GatewayIntents.All
};
return new DiscordSocketClient(config);
});
builder.Services.AddSingleton<InteractionService>(sp =>
{
DiscordSocketClient client = sp.GetRequiredService<DiscordSocketClient>();
InteractionServiceConfig config = new InteractionServiceConfig
{
// Optional settings – you can leave empty or customize
DefaultRunMode = RunMode.Async,
LogLevel = LogSeverity.Info
};
return new InteractionService(client.Rest, config);
});
builder.Services.AddSingleton<SupportFormStateService>();
builder.Services.AddSingleton<PollFormStateService>();
builder.Services.AddSingleton<PollService>();
builder.Services.AddSingleton<GiveawayFormStateService>();
builder.Services.AddSingleton<GiveawayService>();
builder.Services.AddSingleton<RolePanelFormStateService>();
builder.Services.AddSingleton<MemberCounterService>();
// Background task queue for managing delayed operations
builder.Services.AddSingleton<IBackgroundTaskQueue>(new BackgroundTaskQueue());
builder.Services.AddHostedService<BackgroundTaskProcessor>();
// A hosted service that manages lifetime of the Discord connection + command registration
builder.Services.AddHostedService<DiscordBotHostedService>();
// ────────────────────────────────────────
// 2. health checks
builder.Services.AddHealthChecks();
// ────────────────────────────────────────
// Build the app
// ────────────────────────────────────────
string port = Environment.GetEnvironmentVariable("PORT") ?? "8080";
builder.WebHost.UseUrls($"http://0.0.0.0:{port}");
WebApplication app = builder.Build();
// ────────────────────────────────────────
// Health check endpoint that supports both GET and HEAD (important for UptimeRobot)
DateTime startTime = DateTime.UtcNow;
app.MapMethods("/", ["GET", "HEAD"], (HttpContext ctx) =>
{
if (ctx.Request.Method == "HEAD")
{
return Results.Ok();
}
var healthStatus = new
{
status = "healthy",
timestamp = DateTime.UtcNow,
uptime = DateTimeOffset.UtcNow - SharedProperties.Instance.UpTime,
version = "1.0",
environment = Environment.GetEnvironmentVariable("ENVIRONMENT") ?? "development"
};
return Results.Json(healthStatus);
});
// ────────────────────────────────────────
// Run everything
// ────────────────────────────────────────
await app.RunAsync();