Files
Telegram-Panel/src/TelegramPanel.Web/Components/Pages/BatchAdmins.razor
T

250 lines
9.9 KiB
Plaintext

@page "/batch/admins"
@inject IChannelService ChannelService
@inject AccountManagementService AccountManagement
@inject ChannelManagementService ChannelManagement
@inject BatchTaskManagementService TaskManagement
@inject ISnackbar Snackbar
@using TelegramPanel.Data.Entities
@using TelegramPanel.Core.Interfaces
<PageTitle>批量设管理 - Telegram Panel</PageTitle>
<MudText Typo="Typo.h4" Class="mb-4">批量设置管理员</MudText>
<MudGrid>
<MudItem xs="12" md="6">
<MudCard>
<MudCardHeader>
<MudText Typo="Typo.h6">配置管理员</MudText>
</MudCardHeader>
<MudCardContent>
<MudSelect @bind-Value="selectedAccountId" Label="执行账号" Variant="Variant.Outlined" Required="true">
<MudSelectItem Value="0">-- 请选择账号 --</MudSelectItem>
@foreach (var account in accounts)
{
<MudSelectItem Value="@account.Id">@account.Phone (@account.Username)</MudSelectItem>
}
</MudSelect>
<MudSelect @bind-Value="selectedChannelId" Label="目标频道" Variant="Variant.Outlined" Required="true" Class="mt-4">
<MudSelectItem Value="0">-- 请选择频道 --</MudSelectItem>
@foreach (var channel in channels)
{
<MudSelectItem Value="@channel.Id">@channel.Title (@channel.Username)</MudSelectItem>
}
</MudSelect>
<MudTextField @bind-Value="adminTitle" Label="管理员头衔" Variant="Variant.Outlined" Class="mt-4"
HelperText="可选,为管理员设置自定义头衔" />
<MudText Typo="Typo.h6" Class="mt-4 mb-2">管理员权限</MudText>
<MudCheckBox @bind-Value="permissions.ChangeInfo" Label="修改频道信息" />
<MudCheckBox @bind-Value="permissions.PostMessages" Label="发布消息" />
<MudCheckBox @bind-Value="permissions.EditMessages" Label="编辑消息" />
<MudCheckBox @bind-Value="permissions.DeleteMessages" Label="删除消息" />
<MudCheckBox @bind-Value="permissions.BanUsers" Label="封禁用户" />
<MudCheckBox @bind-Value="permissions.InviteUsers" Label="邀请用户" />
<MudCheckBox @bind-Value="permissions.PinMessages" Label="置顶消息" />
<MudCheckBox @bind-Value="permissions.AddAdmins" Label="添加管理员" />
<MudTextField @bind-Value="usernames" Label="用户名列表" Variant="Variant.Outlined" Lines="8" Class="mt-4"
HelperText="每行一个用户名" />
</MudCardContent>
<MudCardActions>
<MudButton Variant="Variant.Text" Color="Color.Secondary" OnClick="ClearForm">清空</MudButton>
<MudSpacer />
<MudButton Variant="Variant.Filled" Color="Color.Primary"
Disabled="@(selectedAccountId == 0 || selectedChannelId == 0 || string.IsNullOrEmpty(usernames) || processing)"
OnClick="StartSetAdmins">
@if (processing)
{
<MudProgressCircular Size="Size.Small" Indeterminate="true" Class="mr-2" />
<span>设置中...</span>
}
else
{
<span>开始设置</span>
}
</MudButton>
</MudCardActions>
</MudCard>
</MudItem>
<MudItem xs="12" md="6">
<MudCard>
<MudCardHeader>
<MudText Typo="Typo.h6">设置结果</MudText>
</MudCardHeader>
<MudCardContent>
<MudList T="string" Dense="true">
@foreach (var result in results)
{
<MudListItem T="string" Icon="@(result.Success ? Icons.Material.Filled.CheckCircle : Icons.Material.Filled.Error)"
IconColor="@(result.Success ? Color.Success : Color.Error)">
<div>
<MudText Typo="Typo.body2">@("@" + result.Username)</MudText>
@if (!result.Success && result.Error != null)
{
<MudText Typo="Typo.caption" Color="Color.Error">@result.Error</MudText>
}
</div>
</MudListItem>
}
</MudList>
@if (results.Any())
{
<MudDivider Class="my-3" />
<MudText Typo="Typo.body2">
成功:@results.Count(r => r.Success) / 总计:@results.Count
</MudText>
}
</MudCardContent>
</MudCard>
</MudItem>
</MudGrid>
@code {
private List<Account> accounts = new();
private List<Channel> channels = new();
private int selectedAccountId = 0;
private int selectedChannelId = 0;
private string adminTitle = "Admin";
private string usernames = "";
private bool processing = false;
private AdminPermissions permissions = new();
private List<SetAdminResult> results = new();
protected override async Task OnInitializedAsync()
{
await LoadAccounts();
await LoadChannels();
}
private async Task LoadAccounts()
{
try
{
var accountList = await AccountManagement.GetActiveAccountsAsync();
accounts = accountList.ToList();
}
catch (Exception ex)
{
Snackbar.Add($"加载账号列表失败:{ex.Message}", Severity.Error);
}
}
private async Task LoadChannels()
{
try
{
var channelList = await ChannelManagement.GetAllChannelsAsync();
channels = channelList.ToList();
}
catch (Exception ex)
{
Snackbar.Add($"加载频道列表失败:{ex.Message}", Severity.Error);
}
}
private async Task StartSetAdmins()
{
processing = true;
results.Clear();
try
{
// 解析用户名列表
var usernameList = usernames.Split('\n', StringSplitOptions.RemoveEmptyEntries)
.Select(u => u.Trim().TrimStart('@'))
.Where(u => !string.IsNullOrEmpty(u))
.ToList();
if (usernameList.Count == 0)
{
Snackbar.Add("请输入至少一个用户名", Severity.Warning);
return;
}
// 获取选中的频道
var channel = channels.FirstOrDefault(c => c.Id == selectedChannelId);
if (channel == null)
{
Snackbar.Add("未找到选中的频道", Severity.Error);
return;
}
// 转换权限
var rights = AdminRights.None;
if (permissions.ChangeInfo) rights |= AdminRights.ChangeInfo;
if (permissions.PostMessages) rights |= AdminRights.PostMessages;
if (permissions.EditMessages) rights |= AdminRights.EditMessages;
if (permissions.DeleteMessages) rights |= AdminRights.DeleteMessages;
if (permissions.BanUsers) rights |= AdminRights.BanUsers;
if (permissions.InviteUsers) rights |= AdminRights.InviteUsers;
if (permissions.PinMessages) rights |= AdminRights.PinMessages;
if (permissions.AddAdmins) rights |= AdminRights.AddAdmins;
// 创建批量任务记录
var task = new BatchTask
{
TaskType = "set_admin",
Total = usernameList.Count,
Completed = 0,
Failed = 0,
Config = System.Text.Json.JsonSerializer.Serialize(new
{
ChannelId = channel.TelegramId,
ChannelTitle = channel.Title,
Rights = rights.ToString(),
Title = adminTitle
})
};
var createdTask = await TaskManagement.CreateTaskAsync(task);
await TaskManagement.StartTaskAsync(createdTask.Id);
// 创建管理员请求列表
var adminRequests = usernameList.Select(u => new AdminRequest(u, rights, adminTitle)).ToList();
// 执行批量设置管理员
var setResults = await ChannelService.BatchSetAdminsAsync(selectedAccountId, channel.TelegramId, adminRequests);
results.AddRange(setResults);
// 更新任务状态
var successCount = setResults.Count(r => r.Success);
var failedCount = setResults.Count(r => !r.Success);
await TaskManagement.UpdateTaskProgressAsync(createdTask.Id, successCount, failedCount);
await TaskManagement.CompleteTaskAsync(createdTask.Id, true);
Snackbar.Add($"设置完成:{successCount}/{setResults.Count} 成功", successCount == setResults.Count ? Severity.Success : Severity.Warning);
}
catch (Exception ex)
{
Snackbar.Add($"设置失败:{ex.Message}", Severity.Error);
}
finally
{
processing = false;
}
}
private void ClearForm()
{
usernames = "";
results.Clear();
}
private class AdminPermissions
{
public bool ChangeInfo { get; set; } = true;
public bool PostMessages { get; set; } = true;
public bool EditMessages { get; set; } = true;
public bool DeleteMessages { get; set; } = true;
public bool BanUsers { get; set; }
public bool InviteUsers { get; set; } = true;
public bool PinMessages { get; set; } = true;
public bool AddAdmins { get; set; }
}
}