@page "/channels/create"
@inject IChannelService ChannelService
@inject AccountManagementService AccountManagement
@inject TelegramPanel.Core.Services.AccountRiskService RiskService
@inject ChannelManagementService ChannelManagement
@inject ChannelGroupManagementService ChannelGroupManagement
@inject ISnackbar Snackbar
@inject NavigationManager Navigation
@inject IDialogService DialogService
@using TelegramPanel.Data.Entities
@using TelegramPanel.Web.Components.Dialogs
创建频道 - Telegram Panel
创建频道
-- 请选择账号 --
@foreach (var account in accounts)
{
@FormatAccountLabel(account)
}
未分组
@foreach (var group in channelGroups)
{
@group.Name
}
@if (isPublic)
{
}
可选设置
取消
@if (creating)
{
创建中...
}
else
{
创建频道
}
@code {
private List accounts = new();
private List channelGroups = new();
private int selectedAccountId = 0;
private int selectedGroupId = 0;
private string channelTitle = "";
private string channelAbout = "";
private bool isPublic = false;
private string username = "";
private bool allowForwarding = true;
private bool creating = false;
protected override async Task OnInitializedAsync()
{
await LoadAccounts();
await LoadGroups();
}
private async Task LoadAccounts()
{
try
{
var accountList = await AccountManagement.GetActiveAccountsAsync();
accounts = accountList
.Where(a => a.Category?.ExcludeFromOperations != true)
.ToList();
}
catch (Exception ex)
{
Snackbar.Add($"加载账号列表失败:{ex.Message}", Severity.Error);
}
}
private async Task LoadGroups()
{
try
{
var groups = await ChannelGroupManagement.GetAllGroupsAsync();
channelGroups = groups.ToList();
}
catch (Exception ex)
{
Snackbar.Add($"加载频道分组失败:{ex.Message}", Severity.Error);
}
}
private async Task CreateChannel()
{
if (selectedAccountId == 0)
{
Snackbar.Add("请选择账号", Severity.Error);
return;
}
if (string.IsNullOrEmpty(channelTitle))
{
Snackbar.Add("请输入频道名称", Severity.Error);
return;
}
if (isPublic && string.IsNullOrEmpty(username))
{
Snackbar.Add("公开频道需要设置用户名", Severity.Error);
return;
}
// 风控检查:创建频道是敏感操作
var account = await AccountManagement.GetAccountAsync(selectedAccountId);
if (account != null)
{
var riskCheck = RiskService.CheckLoginDuration(account);
if (riskCheck.IsRisky)
{
var parameters = new DialogParameters
{
["Message"] = riskCheck.Message,
["DetailedMessage"] = riskCheck.DetailedMessage,
["ShowRecommendations"] = true
};
var options = new DialogOptions { CloseOnEscapeKey = true, MaxWidth = MaxWidth.Medium };
var dialog = DialogService.Show("风控警告", parameters, options);
var result = await dialog.Result;
if (result.Canceled)
return; // 用户取消操作
}
}
creating = true;
try
{
// 调用 Telegram API 创建频道
var channelInfo = await ChannelService.CreateChannelAsync(selectedAccountId, channelTitle, channelAbout, isPublic);
// 如果是公开频道,设置用户名
if (isPublic && !string.IsNullOrEmpty(username))
{
await ChannelService.SetChannelVisibilityAsync(selectedAccountId, channelInfo.TelegramId, true, username);
}
// 是否允许转发(关闭=保护内容)
if (!allowForwarding)
{
await ChannelService.SetForwardingAllowedAsync(selectedAccountId, channelInfo.TelegramId, allowed: false);
}
// 保存到数据库
var channel = new Channel
{
TelegramId = channelInfo.TelegramId,
AccessHash = channelInfo.AccessHash,
Title = channelTitle,
Username = isPublic ? username : null,
IsBroadcast = channelInfo.IsBroadcast,
MemberCount = channelInfo.MemberCount,
About = channelAbout,
CreatorAccountId = selectedAccountId,
GroupId = selectedGroupId > 0 ? selectedGroupId : null,
CreatedAt = DateTime.UtcNow,
SyncedAt = DateTime.UtcNow
};
await ChannelManagement.CreateOrUpdateChannelAsync(channel);
Snackbar.Add($"频道 \"{channelTitle}\" 创建成功", Severity.Success);
Navigation.NavigateTo("/channels");
}
catch (Exception ex)
{
Snackbar.Add($"创建失败:{ex.Message}", Severity.Error);
}
finally
{
creating = false;
}
}
private Task Cancel()
{
Navigation.NavigateTo("/channels");
return Task.CompletedTask;
}
private static string FormatAccountLabel(Account account)
{
var nickname = string.IsNullOrWhiteSpace(account.Nickname) ? null : account.Nickname.Trim();
var username = string.IsNullOrWhiteSpace(account.Username) ? null : account.Username.Trim();
var namePart = nickname ?? account.Phone;
if (!string.IsNullOrWhiteSpace(username))
return $"{namePart} (@{username})";
return namePart;
}
}