2024-10-21 23:38:34 +08:00
|
|
|
package rule
|
2022-09-10 14:09:47 +08:00
|
|
|
|
|
|
|
import (
|
2024-11-10 16:46:59 +08:00
|
|
|
"context"
|
2022-09-10 14:09:47 +08:00
|
|
|
"strings"
|
|
|
|
|
|
|
|
"github.com/sagernet/sing-box/adapter"
|
2024-11-10 16:46:59 +08:00
|
|
|
"github.com/sagernet/sing/service"
|
2022-09-10 14:09:47 +08:00
|
|
|
)
|
|
|
|
|
|
|
|
var _ RuleItem = (*ClashModeItem)(nil)
|
|
|
|
|
|
|
|
type ClashModeItem struct {
|
2024-11-10 16:46:59 +08:00
|
|
|
ctx context.Context
|
|
|
|
clashServer adapter.ClashServer
|
|
|
|
mode string
|
2022-09-10 14:09:47 +08:00
|
|
|
}
|
|
|
|
|
2024-11-10 16:46:59 +08:00
|
|
|
func NewClashModeItem(ctx context.Context, mode string) *ClashModeItem {
|
2022-09-10 14:09:47 +08:00
|
|
|
return &ClashModeItem{
|
2024-11-10 16:46:59 +08:00
|
|
|
ctx: ctx,
|
|
|
|
mode: mode,
|
2022-09-10 14:09:47 +08:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2024-11-10 16:46:59 +08:00
|
|
|
func (r *ClashModeItem) Start() error {
|
|
|
|
r.clashServer = service.FromContext[adapter.ClashServer](r.ctx)
|
|
|
|
return nil
|
|
|
|
}
|
|
|
|
|
2022-09-10 14:09:47 +08:00
|
|
|
func (r *ClashModeItem) Match(metadata *adapter.InboundContext) bool {
|
2024-11-10 16:46:59 +08:00
|
|
|
if r.clashServer == nil {
|
2022-09-10 14:09:47 +08:00
|
|
|
return false
|
|
|
|
}
|
2024-11-10 16:46:59 +08:00
|
|
|
return strings.EqualFold(r.clashServer.Mode(), r.mode)
|
2022-09-10 14:09:47 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
func (r *ClashModeItem) String() string {
|
|
|
|
return "clash_mode=" + r.mode
|
|
|
|
}
|