package controller import ( "context" "fmt" "github.com/Yuzuki616/V2bX/api" "github.com/Yuzuki616/V2bX/app/mydispatcher" "github.com/xtls/xray-core/common/protocol" "github.com/xtls/xray-core/core" "github.com/xtls/xray-core/features/inbound" "github.com/xtls/xray-core/features/outbound" "github.com/xtls/xray-core/features/routing" "github.com/xtls/xray-core/features/stats" "github.com/xtls/xray-core/proxy" ) func (c *Controller) removeInbound(tag string) error { inboundManager := c.server.GetFeature(inbound.ManagerType()).(inbound.Manager) err := inboundManager.RemoveHandler(context.Background(), tag) return err } func (c *Controller) removeOutbound(tag string) error { outboundManager := c.server.GetFeature(outbound.ManagerType()).(outbound.Manager) err := outboundManager.RemoveHandler(context.Background(), tag) return err } func (c *Controller) addInbound(config *core.InboundHandlerConfig) error { inboundManager := c.server.GetFeature(inbound.ManagerType()).(inbound.Manager) rawHandler, err := core.CreateObject(c.server, config) if err != nil { return err } handler, ok := rawHandler.(inbound.Handler) if !ok { return fmt.Errorf("not an InboundHandler: %s", err) } if err := inboundManager.AddHandler(context.Background(), handler); err != nil { return err } return nil } func (c *Controller) addOutbound(config *core.OutboundHandlerConfig) error { outboundManager := c.server.GetFeature(outbound.ManagerType()).(outbound.Manager) rawHandler, err := core.CreateObject(c.server, config) if err != nil { return err } handler, ok := rawHandler.(outbound.Handler) if !ok { return fmt.Errorf("not an InboundHandler: %s", err) } if err := outboundManager.AddHandler(context.Background(), handler); err != nil { return err } return nil } func (c *Controller) addUsers(users []*protocol.User, tag string) error { inboundManager := c.server.GetFeature(inbound.ManagerType()).(inbound.Manager) handler, err := inboundManager.GetHandler(context.Background(), tag) if err != nil { return fmt.Errorf("no such inbound tag: %s", err) } inboundInstance, ok := handler.(proxy.GetInbound) if !ok { return fmt.Errorf("handler %s is not implement proxy.GetInbound", tag) } userManager, ok := inboundInstance.GetInbound().(proxy.UserManager) if !ok { return fmt.Errorf("handler %s is not implement proxy.UserManager", err) } for _, item := range users { mUser, err := item.ToMemoryUser() if err != nil { return err } err = userManager.AddUser(context.Background(), mUser) if err != nil { return err } } return nil } func (c *Controller) removeUsers(users []string, tag string) error { inboundManager := c.server.GetFeature(inbound.ManagerType()).(inbound.Manager) handler, err := inboundManager.GetHandler(context.Background(), tag) if err != nil { return fmt.Errorf("no such inbound tag: %s", err) } inboundInstance, ok := handler.(proxy.GetInbound) if !ok { return fmt.Errorf("handler %s is not implement proxy.GetInbound", tag) } userManager, ok := inboundInstance.GetInbound().(proxy.UserManager) if !ok { return fmt.Errorf("handler %s is not implement proxy.UserManager", err) } for _, email := range users { err = userManager.RemoveUser(context.Background(), email) if err != nil { return err } } return nil } func (c *Controller) getTraffic(email string) (up int64, down int64) { upName := "user>>>" + email + ">>>traffic>>>uplink" downName := "user>>>" + email + ">>>traffic>>>downlink" statsManager := c.server.GetFeature(stats.ManagerType()).(stats.Manager) upCounter := statsManager.GetCounter(upName) downCounter := statsManager.GetCounter(downName) if upCounter != nil { up = upCounter.Value() upCounter.Set(0) } if downCounter != nil { down = downCounter.Value() downCounter.Set(0) } return up, down } func (c *Controller) AddInboundLimiter(tag string, userList *[]api.UserInfo) error { dispather := c.server.GetFeature(routing.DispatcherType()).(*mydispatcher.DefaultDispatcher) err := dispather.Limiter.AddInboundLimiter(tag, c.nodeInfo, userList) return err } func (c *Controller) UpdateInboundLimiter(tag string, updatedUserList *[]api.UserInfo, usersIndex *[]int) error { dispather := c.server.GetFeature(routing.DispatcherType()).(*mydispatcher.DefaultDispatcher) err := dispather.Limiter.UpdateInboundLimiter(tag, c.nodeInfo, updatedUserList, usersIndex) return err } func (c *Controller) DeleteInboundLimiter(tag string) error { dispather := c.server.GetFeature(routing.DispatcherType()).(*mydispatcher.DefaultDispatcher) err := dispather.Limiter.DeleteInboundLimiter(tag) return err } func (c *Controller) GetOnlineDevice(tag string) (*[]api.OnlineUser, error) { dispather := c.server.GetFeature(routing.DispatcherType()).(*mydispatcher.DefaultDispatcher) return dispather.Limiter.GetOnlineDevice(tag) } func (c *Controller) UpdateRule(tag string, newRuleList []api.DetectRule) error { dispather := c.server.GetFeature(routing.DispatcherType()).(*mydispatcher.DefaultDispatcher) err := dispather.RuleManager.UpdateRule(tag, newRuleList) return err } func (c *Controller) GetDetectResult(tag string) (*[]api.DetectResult, error) { dispather := c.server.GetFeature(routing.DispatcherType()).(*mydispatcher.DefaultDispatcher) return dispather.RuleManager.GetDetectResult(tag) }