feat(instance): сервер установщика больше не «главный»
Понятие главного сервера убрано из поведения: сервер, создаваемый установщиком, обычный (is_main = false), автовступления в него нет, а в настройках инстанса он остаётся лишь справочно (main_guild_id → AdminGuildID в ответе API). Клиент от него больше не зависит: новичок начинает с пустым списком серверов.
This commit is contained in:
@@ -97,9 +97,11 @@ func (r *Runner) Run(ctx context.Context, opts Options) (*Result, error) {
|
||||
guildName = DefaultMainGuildName
|
||||
}
|
||||
guild, err := r.store.CreateGuild(ctx, store.CreateGuildParams{
|
||||
Name: guildName,
|
||||
OwnerID: admin.ID,
|
||||
IsMain: true,
|
||||
Name: guildName,
|
||||
OwnerID: admin.ID,
|
||||
// Главного сервера как обязательной точки входа больше нет: сервер
|
||||
// установщика — обычный сервер администратора (решение пользователя).
|
||||
IsMain: false,
|
||||
IsDiscoverable: false,
|
||||
Description: "",
|
||||
})
|
||||
@@ -109,8 +111,10 @@ func (r *Runner) Run(ctx context.Context, opts Options) (*Result, error) {
|
||||
result.GuildID = guild.ID
|
||||
result.CreatedGuild = true
|
||||
|
||||
// Идентификатор сервера администратора сохраняем в настройках только для
|
||||
// справки: автовступления в него нет.
|
||||
if err := r.store.SetInstanceSetting(ctx, "main_guild_id", strconv.FormatUint(guild.ID, 10)); err != nil {
|
||||
return nil, fmt.Errorf("set main guild: %w", err)
|
||||
return nil, fmt.Errorf("set admin guild: %w", err)
|
||||
}
|
||||
if err := r.ensureMainGuildSetup(ctx, guild, admin, result); err != nil {
|
||||
return nil, err
|
||||
|
||||
@@ -126,9 +126,9 @@ func joinMainGuildForTest(t *testing.T, f *fixture, token string) {
|
||||
if err != nil {
|
||||
t.Fatalf("ResolveSession: %v", err)
|
||||
}
|
||||
guild, err := f.store.GetMainGuild(ctx)
|
||||
guild, err := f.store.GetAdminGuild(ctx)
|
||||
if err != nil {
|
||||
t.Fatalf("GetMainGuild: %v", err)
|
||||
t.Fatalf("GetAdminGuild: %v", err)
|
||||
}
|
||||
defaultRole, err := f.store.DefaultRole(ctx, guild.ID)
|
||||
if err != nil {
|
||||
@@ -218,9 +218,9 @@ func TestReadyHidesPrivateChannels(t *testing.T) {
|
||||
f := newFixture(t)
|
||||
ctx := context.Background()
|
||||
// Приватная комната: @user не видит.
|
||||
mainGuild, err := f.store.GetMainGuild(ctx)
|
||||
mainGuild, err := f.store.GetAdminGuild(ctx)
|
||||
if err != nil {
|
||||
t.Fatalf("GetMainGuild: %v", err)
|
||||
t.Fatalf("GetAdminGuild: %v", err)
|
||||
}
|
||||
defaultRole, err := f.store.DefaultRole(ctx, mainGuild.ID)
|
||||
if err != nil {
|
||||
|
||||
@@ -23,9 +23,10 @@ type instancePayload struct {
|
||||
MaxGuildsPerUser int `json:"max_guilds_per_user"`
|
||||
MaxMembersPerGuild int `json:"max_members_per_guild"`
|
||||
MaxMessageLength int `json:"max_message_length"`
|
||||
MainGuildID string `json:"main_guild_id,omitempty"`
|
||||
UserCount int `json:"user_count"`
|
||||
GuildCount int `json:"guild_count"`
|
||||
// AdminGuildID — сервер, созданный установщиком (справочно, автовхода нет).
|
||||
AdminGuildID string `json:"main_guild_id,omitempty"`
|
||||
UserCount int `json:"user_count"`
|
||||
GuildCount int `json:"guild_count"`
|
||||
}
|
||||
|
||||
type instanceOutput struct {
|
||||
@@ -441,21 +442,17 @@ func (s *Server) instancePayload(ctx context.Context) (instancePayload, error) {
|
||||
GuildCount: len(guilds),
|
||||
}
|
||||
if settings.MainGuildID != 0 {
|
||||
payload.MainGuildID = formatSnowflake(settings.MainGuildID)
|
||||
payload.AdminGuildID = formatSnowflake(settings.MainGuildID)
|
||||
}
|
||||
return payload, nil
|
||||
}
|
||||
|
||||
// createGuildAsAdmin создаёт сервер в обход лимитов и фиксирует это в аудите.
|
||||
func (s *Server) createGuildAsAdmin(ctx context.Context, admin, owner *store.User, name string) (*store.Guild, error) {
|
||||
settings, err := s.store.InstanceSettings(ctx)
|
||||
if err != nil {
|
||||
return nil, humaError(err)
|
||||
}
|
||||
guild, err := s.store.CreateGuild(ctx, store.CreateGuildParams{
|
||||
Name: name,
|
||||
OwnerID: owner.ID,
|
||||
IsMain: settings.MainGuildID == 0,
|
||||
IsMain: false,
|
||||
IsDiscoverable: false,
|
||||
})
|
||||
if err != nil {
|
||||
@@ -469,11 +466,6 @@ func (s *Server) createGuildAsAdmin(ctx context.Context, admin, owner *store.Use
|
||||
}); err != nil {
|
||||
return nil, humaError(err)
|
||||
}
|
||||
if guild.IsMain {
|
||||
if err := s.store.SetInstanceSetting(ctx, "main_guild_id", strconv.FormatUint(guild.ID, 10)); err != nil {
|
||||
return nil, humaError(err)
|
||||
}
|
||||
}
|
||||
s.recordAudit(ctx, admin, guild.ID, "guild.create", "guild", &guild.ID, "created by instance admin")
|
||||
s.recordAudit(ctx, admin, guild.ID, "limits.bypass", "guild", &guild.ID, "instance admin bypassed guild limits")
|
||||
if s.gateway != nil {
|
||||
|
||||
@@ -73,6 +73,18 @@ func (s *Store) GetGuild(ctx context.Context, id uint64) (*Guild, error) {
|
||||
return scanGuild(s.reader.QueryRowContext(ctx, `SELECT `+guildColumns+` FROM guilds WHERE id = ?`, int64(id)))
|
||||
}
|
||||
|
||||
// GetAdminGuild возвращает сервер, созданный установщиком (справочно).
|
||||
func (s *Store) GetAdminGuild(ctx context.Context) (*Guild, error) {
|
||||
settings, err := s.InstanceSettings(ctx)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
if settings.MainGuildID == 0 {
|
||||
return nil, ErrNotFound
|
||||
}
|
||||
return s.GetGuild(ctx, settings.MainGuildID)
|
||||
}
|
||||
|
||||
func (s *Store) GetMainGuild(ctx context.Context) (*Guild, error) {
|
||||
return scanGuild(s.reader.QueryRowContext(ctx,
|
||||
`SELECT `+guildColumns+` FROM guilds WHERE is_main = 1 ORDER BY id LIMIT 1`))
|
||||
|
||||
Reference in New Issue
Block a user