Files
Vanadium-2023-2025-Leak-Server/Controllers/Misc/ClubsController.cs
T
skidfire fe3468c65d yikes,
2026-09-06 19:59:27 -04:00

904 lines
35 KiB
C#

using Microsoft.AspNetCore.Mvc;
using Newtonsoft.Json;
using Vanadium.Auth;
using Vanadium.Classes.DBs;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using static Vanadium.Classes.DBs.DBClasses.ClubsDBClasses;
namespace Vanadium.Controllers
{
[ApiController]
public class ClubsController : ControllerBase
{
private static int ParseVisibility(string? raw)
{
if (string.IsNullOrWhiteSpace(raw)) return -1;
return raw.ToLowerInvariant() switch
{
"public" => (int)ClubVisibility.Public,
"unlisted" => (int)ClubVisibility.Unlisted,
"private" => (int)ClubVisibility.Private,
"0" => (int)ClubVisibility.Private,
"1" => (int)ClubVisibility.Public,
"2" => (int)ClubVisibility.Unlisted,
_ => -1
};
}
private static int ParseJoinability(string? raw)
{
if (string.IsNullOrWhiteSpace(raw)) return -1;
return raw.ToLowerInvariant() switch
{
"open" => (int)ClubJoinability.Open,
"approvalrequired" => (int)ClubJoinability.ApprovalRequired,
"closed" => (int)ClubJoinability.Closed,
"0" => (int)ClubJoinability.Open,
"1" => (int)ClubJoinability.ApprovalRequired,
"2" => (int)ClubJoinability.Closed,
_ => -1
};
}
[HttpGet("/club/{clubId}/members/{userId}")]
public IActionResult GetClubMember(long clubId, long userId)
{
var id = AuthStuff.GetPlayerId(Request);
if (id == null) return Unauthorized("");
var member = ClubsDB.GetClubMembers(clubId).FirstOrDefault(m => m.AccountId == userId);
if (member == null) return Ok(new {});
return Ok(member);
}
[HttpGet("/club/search")]
public IActionResult SearchClubs(
[FromQuery] string? query,
[FromQuery] string? category,
[FromQuery] int sort = 0,
[FromQuery] int count = 30,
[FromQuery] int skip = 0)
{
count = Math.Clamp(count, 1, 100);
var result = ClubsDB.Search(query, category, sort, count, skip);
return new ContentResult
{
Content = JsonConvert.SerializeObject(result),
ContentType = "application/json",
StatusCode = 200
};
}
[HttpPost("/club/create")]
public IActionResult CreateClub(
[FromForm] string name,
[FromForm] string? description,
[FromForm] string? category)
{
var id = AuthStuff.GetPlayerId(Request);
if (id == null) return Unauthorized("");
var club = ClubsDB.CreateClub(
id.Value,
name.Trim(),
description?.Trim() ?? "",
(category ?? "Social").Trim());
return new ContentResult
{
Content = JsonConvert.SerializeObject(new
{
success = true,
error = "",
value = ClubsDB.ToDetails(club, id.Value)
}),
ContentType = "application/json",
StatusCode = 200
};
}
[HttpGet("/club/categoryTags")]
public IActionResult GetClubCategoryTags()
{
var id = AuthStuff.GetPlayerId(Request);
if (id == null) return Unauthorized("");
var tags = new List<string>
{
"Social",
"Creative",
"Competitive",
"Casual",
"Educational",
"Entertainment",
"Lifestyle"
};
return Ok(tags);
}
[HttpGet("/club/mine/created")]
public IActionResult GetMyCreatedClubs()
{
var id = AuthStuff.GetPlayerId(Request);
if (id == null) return Unauthorized("");
var clubs = ClubsDB.GetClubsCreatedBy(id.Value)
.Select(ClubsDB.ToSummary)
.ToList();
return new ContentResult
{
Content = JsonConvert.SerializeObject(clubs),
ContentType = "application/json",
StatusCode = 200
};
}
[HttpGet("/club/mine/member")]
public IActionResult GetMyMemberClubs()
{
var id = AuthStuff.GetPlayerId(Request);
if (id == null) return Unauthorized("");
var clubs = ClubsDB.GetClubsJoinedBy(id.Value)
.Where(c => c.Visibility != 2)
.Select(ClubsDB.ToSummary)
.ToList();
return new ContentResult
{
Content = JsonConvert.SerializeObject(clubs),
ContentType = "application/json",
StatusCode = 200
};
}
[HttpGet("/club/account/{player}/created")]
public IActionResult GetOthersCreatedClubs(long player)
{
var id = AuthStuff.GetPlayerId(Request);
if (id == null) return Unauthorized("");
var clubs = ClubsDB.GetClubsCreatedBy(player)
.Where(c => c.Visibility != 2)
.Select(ClubsDB.ToSummary)
.ToList();
return new ContentResult
{
Content = JsonConvert.SerializeObject(clubs),
ContentType = "application/json",
StatusCode = 200
};
}
[HttpGet("/club/{clubId}")]
[HttpGet("/club/{clubId}/details")]
public IActionResult GetClubDetails(long clubId)
{
var id = AuthStuff.GetPlayerId(Request);
if (id == null) return Unauthorized("");
var club = ClubsDB.GetClub(clubId);
if (club == null) return NotFound("");
return Ok(new ClubDetailsDTO
{
Club = ClubsDB.ToSummary(club),
CustomTags = club.CustomTags,
AdditionalImages = club.AdditionalImages,
CoownerPermissions = club.Permissions.FirstOrDefault(p => p.Type == (int)ClubMemberType.CoOwner),
ModeratorPermissions = club.Permissions.FirstOrDefault(p => p.Type == (int)ClubMemberType.Moderator),
MemberPermissions = club.Permissions.FirstOrDefault(p => p.Type == (int)ClubMemberType.Member),
MyMembershipType = club.Members
.FirstOrDefault(m => m.AccountId == id.Value)?.MemberType ?? 0
});
}
[HttpGet("/club/{clubId}/members")]
public IActionResult GetClubMembers(long clubId, [FromQuery] int? membershipType)
{
var id = AuthStuff.GetPlayerId(Request);
if (id == null) return Unauthorized("");
var club = ClubsDB.GetClub(clubId);
if (club == null) return NotFound("");
var members = ClubsDB.GetClubMembers(clubId);
if (membershipType.HasValue)
members = members.Where(m => m.MembershipType == membershipType.Value).ToList();
return new ContentResult
{
Content = JsonConvert.SerializeObject(new { value = members, success = true, error_id = (int?)null, error = (string?)null }),
ContentType = "application/json",
StatusCode = 200
};
}
[HttpDelete("/club/{clubId}")]
public IActionResult DeleteClub(long clubId)
{
var id = AuthStuff.GetPlayerId(Request);
if (id == null) return Unauthorized("");
var club = ClubsDB.GetClub(clubId);
if (club == null) return NotFound("");
if (club.CreatorAccountId != id.Value)
{
APIController.SendNonHileWebhook(id.Value, $"Attempted to delete club {clubId} but is not the creator.");
return StatusCode(403);
}
ClubsDB.DeleteClub(clubId);
return new ContentResult
{
Content = JsonConvert.SerializeObject(new { success = true, error = (string?)null, value = ClubsDB.ToDetails(club, id.Value) }),
ContentType = "application/json",
StatusCode = 200
};
}
[HttpPut("/club/{clubId}/modify")]
public IActionResult ModifyClub(
long clubId,
[FromForm] string? name,
[FromForm] string? description,
[FromForm] string? category)
{
var id = AuthStuff.GetPlayerId(Request);
if (id == null) return Unauthorized("");
var existing = ClubsDB.GetClub(clubId);
if (existing == null) return NotFound("");
if (!ClubsDB.CanEditDetails(clubId, id.Value))
{
APIController.SendNonHileWebhook(id.Value, $"Attempted to modify club {clubId} but does not have permission.");
return StatusCode(403);
}
var club = ClubsDB.Modify(
clubId,
(name ?? existing.Name).Trim(),
(description ?? existing.Description ?? "").Trim(),
(category ?? existing.Category).Trim(),
id.Value);
if (club == null) return Unauthorized("");
return new ContentResult
{
Content = JsonConvert.SerializeObject(new { success = true, error = (string?)null, value = ClubsDB.ToDetails(club, id.Value) }),
ContentType = "application/json",
StatusCode = 200
};
}
[HttpPut("/club/{clubId}/modifydetails")]
public IActionResult ModifyClubDetails(
long clubId,
[FromForm] string? visibility,
[FromForm] string? joinability,
[FromForm] string? allowJuniors,
[FromForm] string? customTags)
{
var id = AuthStuff.GetPlayerId(Request);
if (id == null) return Unauthorized("");
if (!ClubsDB.CanEditDetails(clubId, id.Value))
{
APIController.SendNonHileWebhook(id.Value, $"Attempted to modify club {clubId} but does not have permission. (2)");
return StatusCode(403);
}
int? vis = visibility != null ? ParseVisibility(visibility) : (int?)null;
int? join = joinability != null ? ParseJoinability(joinability) : (int?)null;
if (join == 1) return StatusCode(501);
bool? juniors = null;
if (allowJuniors != null)
juniors = allowJuniors.ToLowerInvariant() is "true" or "1";
List<string>? tags = null;
if (customTags != null)
tags = customTags
.Split(',', StringSplitOptions.RemoveEmptyEntries)
.Select(t => t.Trim())
.Where(t => !string.IsNullOrEmpty(t))
.ToList();
var club = ClubsDB.ModifyDetails(clubId, vis, join, juniors, tags, id.Value);
if (club == null) return NotFound("");
return new ContentResult
{
Content = JsonConvert.SerializeObject(new { success = true, error = "", value = ClubsDB.ToDetails(club, id.Value) }),
ContentType = "application/json",
StatusCode = 200
};
}
[HttpPut("/club/{clubId}/minlevel")]
public IActionResult SetMinLevel(long clubId, [FromForm] int minLevel)
{
var id = AuthStuff.GetPlayerId(Request);
if (id == null) return Unauthorized("");
if (!ClubsDB.CanEditDetails(clubId, id.Value))
{
APIController.SendNonHileWebhook(id.Value, $"Attempted to set min level for club {clubId} but does not have permission.");
return StatusCode(403);
}
var club = ClubsDB.SetMinLevel(clubId, minLevel, id.Value);
if (club == null) return NotFound("");
return new ContentResult
{
Content = JsonConvert.SerializeObject(new { success = true, error = (string?)null, value = ClubsDB.ToDetails(club, id.Value) }),
ContentType = "application/json",
StatusCode = 200
};
}
[HttpPut("/club/{clubId}/mainimage")]
public IActionResult SetMainImage(long clubId, [FromForm] string imageName)
{
var id = AuthStuff.GetPlayerId(Request);
if (id == null) return Unauthorized("");
var existing = ClubsDB.GetClub(clubId);
if (existing == null) return NotFound("");
if (!ClubsDB.CanEditDetails(clubId, id.Value))
{
APIController.SendNonHileWebhook(id.Value, $"Attempted to set the main image for club {clubId} but does not have permission.");
return StatusCode(403);
}
var club = ClubsDB.SetMainImage(clubId, imageName, id.Value);
if (club == null) return NotFound("");
return new ContentResult
{
Content = JsonConvert.SerializeObject(new { success = true, error = "", value = ClubsDB.ToDetails(club, id.Value) }),
ContentType = "application/json",
StatusCode = 200
};
}
[HttpDelete("/club/{clubId}/mainimage")]
public IActionResult DeleteMainImage(long clubId)
{
var id = AuthStuff.GetPlayerId(Request);
if (id == null) return Unauthorized("");
var existing = ClubsDB.GetClub(clubId);
if (existing == null) return NotFound("");
if (!ClubsDB.CanEditDetails(clubId, id.Value))
{
APIController.SendNonHileWebhook(id.Value, $"Attempted to delete the main image for club {clubId} but does not have permission.");
return StatusCode(403);
}
if (existing.AdditionalImages.Count == 0)
return StatusCode(405);
var club = ClubsDB.DeleteMainImage(clubId, id.Value);
if (club == null) return NotFound("");
return new ContentResult
{
Content = JsonConvert.SerializeObject(new { success = true, error = "", value = ClubsDB.ToDetails(club, id.Value) }),
ContentType = "application/json",
StatusCode = 200
};
}
[HttpPut("/club/{clubId}/additionalimage/{index}")]
public IActionResult SetAdditionalImage(long clubId, int index, [FromForm] string imageName)
{
var id = AuthStuff.GetPlayerId(Request);
if (id == null) return Unauthorized("");
var existing = ClubsDB.GetClub(clubId);
if (existing == null) return NotFound("");
if (!ClubsDB.CanEditDetails(clubId, id.Value))
{
APIController.SendNonHileWebhook(id.Value, $"Attempted to set additional image {index} for club {clubId} but does not have permission.");
return StatusCode(403);
}
var club = ClubsDB.SetAdditionalImage(clubId, index, imageName, id.Value);
if (club == null) return NotFound("");
return new ContentResult
{
Content = JsonConvert.SerializeObject(new { success = true, error = "", value = ClubsDB.ToDetails(club, id.Value) }),
ContentType = "application/json",
StatusCode = 200
};
}
[HttpPut("/club/{clubId}/clubhouse")]
public IActionResult SetClubhouse(long clubId, [FromForm] long roomId)
{
var id = AuthStuff.GetPlayerId(Request);
if (id == null) return Unauthorized("");
var existing = ClubsDB.GetClub(clubId);
if (existing == null) return NotFound("");
if (!ClubsDB.IsOwnerOrCoOwner(clubId, id.Value) && existing.CreatorAccountId != id.Value)
{
APIController.SendNonHileWebhook(id.Value, $"Attempted to set clubhouse for club {clubId} but does not have permission.");
return StatusCode(403);
}
var club = ClubsDB.SetClubhouse(clubId, roomId, id.Value);
if (club == null) return NotFound("");
return new ContentResult
{
Content = JsonConvert.SerializeObject(new { success = true, error = "", value = ClubsDB.ToDetails(club, id.Value) }),
ContentType = "application/json",
StatusCode = 200
};
}
[HttpDelete("/club/{clubId}/clubhouse")]
public IActionResult RemoveClubhouse(long clubId)
{
var id = AuthStuff.GetPlayerId(Request);
if (id == null) return Unauthorized("");
var existing = ClubsDB.GetClub(clubId);
if (existing == null) return NotFound("");
if (!ClubsDB.IsOwnerOrCoOwner(clubId, id.Value) && existing.CreatorAccountId != id.Value)
{
APIController.SendNonHileWebhook(id.Value, $"Attempted to remove clubhouse for club {clubId} but does not have permission.");
return StatusCode(403);
}
var club = ClubsDB.RemoveClubhouse(clubId, id.Value);
if (club == null) return NotFound("");
return new ContentResult
{
Content = JsonConvert.SerializeObject(new { success = true, error = "", value = ClubsDB.ToDetails(club, id.Value) }),
ContentType = "application/json",
StatusCode = 200
};
}
[HttpGet("/club/{clubId}/hasDisabledClubChat")]
public IActionResult HasDisabledClubChat(long clubId)
{
var id = AuthStuff.GetPlayerId(Request);
if (id == null) return Unauthorized("");
var club = ClubsDB.GetClub(clubId);
if (club == null) return NotFound("");
return Ok(false);
}
[HttpPut("/club/{clubId}/members/requesttojoin")]
public async Task<IActionResult> RequestToJoin(long clubId)
{
var id = AuthStuff.GetPlayerId(Request);
if (id == null) return Unauthorized("");
var existing = ClubsDB.GetClub(clubId);
if (existing == null) return NotFound("");
if (existing.Joinability == (int)ClubJoinability.Closed) return BadRequest(new { success = false, error = "The club is invite only", error_id = "Club.InviteOnly", value = (object?)null });
var club = ClubsDB.JoinClub(clubId, id.Value);
if (club == null) return NotFound("");
var joined = club.Members.FirstOrDefault(m => m.AccountId == id.Value);
if (joined != null)
{
await NotificationsController.BroadcastClubMembershipUpdate(joined.MemberId, id.Value, clubId, joined.MemberType, joined.JoinedAt);
await NotificationsController.BroadcastCreatorClubSubscriptionUpdate(club.CreatorAccountId, clubId, joined.MemberType);
}
return new ContentResult
{
Content = JsonConvert.SerializeObject(new { success = true, error = "", value = ClubsDB.ToDetails(club, id.Value) }),
ContentType = "application/json",
StatusCode = 200
};
}
[HttpPost("/club/{clubId}/members/leave")]
public async Task<IActionResult> RequestLeaveClub(long clubId)
{
var id = AuthStuff.GetPlayerId(Request);
if (id == null) return Unauthorized("");
var existing = ClubsDB.GetClub(clubId);
if (existing == null) return NotFound("");
var leaving = existing.Members.FirstOrDefault(m => m.AccountId == id.Value);
var club = ClubsDB.LeaveClub(clubId, id.Value);
if (club == null) return NotFound("");
if (leaving != null)
{
await NotificationsController.BroadcastClubMembershipUpdate(leaving.MemberId, id.Value, clubId, 0, DateTime.UtcNow);
await NotificationsController.BroadcastCreatorClubSubscriptionUpdate(existing.CreatorAccountId, clubId, 0);
}
return new ContentResult
{
Content = JsonConvert.SerializeObject(new { success = true, error = "", value = ClubsDB.ToDetails(club, id.Value) }),
ContentType = "application/json",
StatusCode = 200
};
}
[HttpPut("/club/{clubId}/permissions/{membershipType}")]
public IActionResult SetPermissions(long clubId, int membershipType, [FromForm] bool approveMember, [FromForm] bool banUnban, [FromForm] bool createEvent, [FromForm] bool editDetails, [FromForm] bool editPermissionSettings, [FromForm] bool postAnnouncement)
{
var id = AuthStuff.GetPlayerId(Request);
if (id == null) return Unauthorized("");
var existing = ClubsDB.GetClub(clubId);
if (existing == null) return NotFound("");
if (!ClubsDB.IsOwnerOrCoOwner(clubId, id.Value))
{
APIController.SendNonHileWebhook(id.Value, $"Attempted to set permissions for club {clubId} but does not have permission.");
return StatusCode(403);
}
var club = ClubsDB.SetPermissions(clubId, membershipType, approveMember, banUnban, createEvent, editDetails, editPermissionSettings, postAnnouncement);
if (club == null) return NotFound("");
return new ContentResult
{
Content = JsonConvert.SerializeObject(new { success = true, error = "", value = ClubsDB.ToDetails(club, id.Value) }),
ContentType = "application/json",
StatusCode = 200
};
}
[HttpGet("/club/home/me")]
public IActionResult GetMyHomeClub()
{
var player = AuthStuff.GetCurrentPlayer(Request);
if (player == null) return Unauthorized("");
int homeClubId = (int)player.Player.PlayerExtra.HomeClubhouseId;
if (homeClubId == 0 || homeClubId == null) return NotFound("");
var club = ClubsDB.GetClub(homeClubId);
if (club == null) return NotFound("");
return new ContentResult
{
Content = JsonConvert.SerializeObject(ClubsDB.ToSummary(club)),
ContentType = "application/json",
StatusCode = 200
};
}
[HttpPut("/club/home/me")]
public IActionResult SetMyHomeClub([FromForm] long clubId)
{
var player = AuthStuff.GetCurrentPlayer(Request);
if (player == null) return Unauthorized("");
var club = ClubsDB.GetClub(clubId);
if (club == null) return NotFound("");
player.Player.PlayerExtra.HomeClubhouseId = clubId;
PlayerDB.Players.Update(player);
return Ok(new { success = true, error = (string?)null, value = (object?)null });
}
[HttpDelete("/club/home/me")]
public IActionResult DeleteMyHomeClub([FromForm] long clubId)
{
var player = AuthStuff.GetCurrentPlayer(Request);
if (player == null) return Unauthorized("");
player.Player.PlayerExtra.HomeClubhouseId = 0;
PlayerDB.Players.Update(player);
return Ok(new { success = true, error = (string?)null, value = (object?)null });
}
[HttpGet("/announcements/mine")]
public IActionResult GetMyAnnouncements()
{
var id = AuthStuff.GetPlayerId(Request);
if (id == null) return Unauthorized("");
var result = ClubsDB.GetAnnouncementsForMyClubs(id.Value);
return new ContentResult
{
Content = JsonConvert.SerializeObject(new { success = true, error = "", value = result }),
ContentType = "application/json",
StatusCode = 200
};
}
[HttpGet("/announcements/club/{clubId}")]
public IActionResult GetClubAnnouncements(long clubId)
{
var id = AuthStuff.GetPlayerId(Request);
if (id == null) return Unauthorized("");
var result = ClubsDB.GetClubAnnouncements(clubId, id.Value);
if (result == null) return NotFound("");
return new ContentResult
{
Content = JsonConvert.SerializeObject(new { success = true, error = "", value = result }),
ContentType = "application/json",
StatusCode = 200
};
}
[HttpPost("/announcements/club/{clubId}")]
public IActionResult CreateAnnouncement(
long clubId,
[FromForm] string title,
[FromForm] string body,
[FromForm] string? imageName,
[FromForm] string? meta)
{
var id = AuthStuff.GetPlayerId(Request);
if (id == null) return Unauthorized("");
if (string.IsNullOrWhiteSpace(title) || title.Length > 50)
return BadRequest(new { success = false, error = "Title must be between 1 and 50 characters." });
if (string.IsNullOrWhiteSpace(body) || body.Length > 1000)
return BadRequest(new { success = false, error = "Body must be between 1 and 1000 characters." });
var club = ClubsDB.GetClub(clubId);
if (club == null) return NotFound("");
if (!ClubsDB.CanPostAnnouncement(clubId, id.Value))
return StatusCode(403);
var announcement = ClubsDB.CreateAnnouncement(clubId, id.Value, title, body, imageName, meta);
if (announcement == null) return StatusCode(500);
return new ContentResult
{
Content = JsonConvert.SerializeObject(new { success = true, error = "", value = announcement.AnnouncementId }),
ContentType = "application/json",
StatusCode = 200
};
}
[HttpPut("/announcements/club/{clubId}/{announcementId}")]
public IActionResult EditAnnouncement(
long clubId,
long announcementId,
[FromForm] string title,
[FromForm] string body,
[FromForm] string? imageName,
[FromForm] string? meta)
{
var id = AuthStuff.GetPlayerId(Request);
if (id == null) return Unauthorized("");
if (string.IsNullOrWhiteSpace(title) || title.Length > 50)
return BadRequest(new { success = false, error = "Title must be between 1 and 50 characters." });
if (string.IsNullOrWhiteSpace(body) || body.Length > 1000)
return BadRequest(new { success = false, error = "Body must be between 1 and 1000 characters." });
var club = ClubsDB.GetClub(clubId);
if (club == null) return NotFound("");
var announcement = ClubsDB.EditAnnouncement(clubId, announcementId, id.Value, title, body, imageName, meta);
if (announcement == null) return StatusCode(403);
return new ContentResult
{
Content = JsonConvert.SerializeObject(new { success = true, error = "", value = announcement.AnnouncementId }),
ContentType = "application/json",
StatusCode = 200
};
}
[HttpDelete("/announcements/club/{clubId}/{announcementId}")]
public IActionResult DeleteAnnouncement(long clubId, long announcementId)
{
var id = AuthStuff.GetPlayerId(Request);
if (id == null) return Unauthorized("");
var club = ClubsDB.GetClub(clubId);
if (club == null) return NotFound("");
bool deleted = ClubsDB.DeleteAnnouncement(clubId, announcementId, id.Value);
if (!deleted) return StatusCode(403);
return new ContentResult
{
Content = JsonConvert.SerializeObject(new { success = true, error = (string?)null, value = (object?)null }),
ContentType = "application/json",
StatusCode = 200
};
}
[HttpPost("/announcements/club/{clubId}/{announcementId}/read")]
public IActionResult MarkAnnouncementRead(long clubId, long announcementId)
{
var id = AuthStuff.GetPlayerId(Request);
if (id == null) return Unauthorized("");
bool ok = ClubsDB.MarkAnnouncementRead(clubId, announcementId, id.Value);
if (!ok) return NotFound("");
return new ContentResult
{
Content = JsonConvert.SerializeObject(new { success = true, error = (string?)null, value = (object?)null }),
ContentType = "application/json",
StatusCode = 200
};
}
[HttpPut("/club/{clubId}/members/{targetId}/role")]
public async Task<IActionResult> SetMemberRole(long clubId, long targetId, [FromForm] int membershipType)
{
var id = AuthStuff.GetPlayerId(Request);
if (id == null) return Unauthorized("");
var club = ClubsDB.GetClub(clubId);
if (club == null) return NotFound("");
if (!ClubsDB.IsOwnerOrCoOwner(clubId, id.Value) && club.CreatorAccountId != id.Value)
{
APIController.SendNonHileWebhook(id.Value, $"Attempted to set role in club {clubId} but does not have permission.");
return StatusCode(403);
}
var target = club.Members.FirstOrDefault(m => m.AccountId == targetId);
if (target == null) return NotFound("");
bool ok = ClubsDB.SetMemberRole(clubId, targetId, membershipType, id.Value);
if (!ok) return NotFound("");
await NotificationsController.BroadcastClubMembershipUpdate(target.MemberId, targetId, clubId, membershipType, target.JoinedAt);
var updated = ClubsDB.GetClub(clubId);
return new ContentResult
{
Content = JsonConvert.SerializeObject(new { success = true, error = (string?)null, value = updated != null ? ClubsDB.ToDetails(updated, id.Value) : null }),
ContentType = "application/json",
StatusCode = 200
};
}
[HttpPut("/club/{clubId}/members/{targetId}/kick")]
public async Task<IActionResult> KickMember(long clubId, long targetId)
{
var id = AuthStuff.GetPlayerId(Request);
if (id == null) return Unauthorized("");
var club = ClubsDB.GetClub(clubId);
if (club == null) return NotFound("");
var target = club.Members.FirstOrDefault(m => m.AccountId == targetId);
var result = ClubsDB.KickMember(clubId, targetId, id.Value);
if (result == null)
{
APIController.SendNonHileWebhook(id.Value, $"Attempted to kick {targetId} from club {clubId} but does not have permission.");
return StatusCode(403);
}
if (target != null)
await NotificationsController.BroadcastClubMembershipUpdate(target.MemberId, targetId, clubId, 0, DateTime.UtcNow);
return new ContentResult
{
Content = JsonConvert.SerializeObject(new { success = true, error = (string?)null, value = ClubsDB.ToDetails(result, id.Value) }),
ContentType = "application/json",
StatusCode = 200
};
}
[HttpPut("/club/{clubId}/members/{targetId}/ban")]
public async Task<IActionResult> BanMember(long clubId, long targetId)
{
var id = AuthStuff.GetPlayerId(Request);
if (id == null) return Unauthorized("");
var club = ClubsDB.GetClub(clubId);
if (club == null) return NotFound("");
var target = club.Members.FirstOrDefault(m => m.AccountId == targetId);
bool ok = ClubsDB.BanMember(clubId, targetId, id.Value);
if (!ok)
{
APIController.SendNonHileWebhook(id.Value, $"Attempted to ban {targetId} from club {clubId} but does not have permission.");
return StatusCode(403);
}
if (target != null)
await NotificationsController.BroadcastClubMembershipUpdate(target.MemberId, targetId, clubId, 0, DateTime.UtcNow);
var updated = ClubsDB.GetClub(clubId);
return new ContentResult
{
Content = JsonConvert.SerializeObject(new { success = true, error = (string?)null, value = updated != null ? ClubsDB.ToDetails(updated, id.Value) : null }),
ContentType = "application/json",
StatusCode = 200
};
}
[HttpPut("/club/{clubId}/members/{targetId}/unban")]
public IActionResult UnbanMember(long clubId, long targetId)
{
var id = AuthStuff.GetPlayerId(Request);
if (id == null) return Unauthorized("");
bool ok = ClubsDB.UnbanMember(clubId, targetId, id.Value);
if (!ok)
{
APIController.SendNonHileWebhook(id.Value, $"Attempted to unban {targetId} from club {clubId} but does not have permission.");
return StatusCode(403);
}
var updated = ClubsDB.GetClub(clubId);
return new ContentResult
{
Content = JsonConvert.SerializeObject(new { success = true, error = (string?)null, value = updated != null ? ClubsDB.ToDetails(updated, id.Value) : null }),
ContentType = "application/json",
StatusCode = 200
};
}
[HttpPut("/club/{clubId}/members/{targetId}/approve")]
public async Task<IActionResult> ApproveMember(long clubId, long targetId)
{
var id = AuthStuff.GetPlayerId(Request);
if (id == null) return Unauthorized("");
var club = ClubsDB.GetClub(clubId);
if (club == null) return NotFound("");
var result = ClubsDB.ApproveMember(clubId, targetId, id.Value);
if (result == null)
{
APIController.SendNonHileWebhook(id.Value, $"Attempted to approve {targetId} in club {clubId} but does not have permission.");
return StatusCode(403);
}
var member = result.Members.FirstOrDefault(m => m.AccountId == targetId);
if (member != null)
{
await NotificationsController.BroadcastClubMembershipUpdate(member.MemberId, targetId, clubId, member.MemberType, member.JoinedAt);
await NotificationsController.BroadcastCreatorClubSubscriptionUpdate(result.CreatorAccountId, clubId, member.MemberType);
}
return new ContentResult
{
Content = JsonConvert.SerializeObject(new { success = true, error = (string?)null, value = ClubsDB.ToDetails(result, id.Value) }),
ContentType = "application/json",
StatusCode = 200
};
}
}
}