@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; } }