250 lines
9.9 KiB
Plaintext
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; }
|
|
}
|
|
}
|