diff --git a/ddob/README.md b/ddob/README.md new file mode 100644 index 0000000..6060e9c --- /dev/null +++ b/ddob/README.md @@ -0,0 +1,7 @@ +# DDNS over BearyChat + +## Usage + +``` +$ ./ddob +``` diff --git a/ddob/cmd/ddob/main.go b/ddob/cmd/ddob/main.go new file mode 100644 index 0000000..71acb73 --- /dev/null +++ b/ddob/cmd/ddob/main.go @@ -0,0 +1,39 @@ +package main + +import ( + "context" + "fmt" + "log" + "regexp" + + "github.com/bearyinnovative/radagast/bearychat" + "github.com/bearyinnovative/radagast/config" + "github.com/bearyinnovative/radagast/ddob" +) + +func main() { + ctx := context.Background() + ctx = config.MustMakeContext(ctx, "./radagast.toml") + ctx = bearychat.MustMakeContext(ctx) + + config := config.FromContext(ctx) + + p := regexp.MustCompile(config.Get("ddob.pattern").String()) + addrs, err := ddob.ListInterfaceAddrs(p) + if err != nil { + log.Fatal(err) + } + + if len(addrs) < 1 { + log.Fatalf("no addrs returned") + } + + bearychat.SendToVchannel( + ctx, + bearychat.RTMClientFromContext(ctx), + bearychat.RTMMessage{ + Text: fmt.Sprintf("`ddob` 我的 IP 是 `%s`", addrs[0]), + VchannelId: config.Get("ddob.bearychat-vchannel-id").String(), + }, + ) +} diff --git a/ddob/interfaces.go b/ddob/interfaces.go new file mode 100644 index 0000000..1191ad3 --- /dev/null +++ b/ddob/interfaces.go @@ -0,0 +1,30 @@ +package ddob + +import ( + "net" + "regexp" +) + +func ListInterfaceAddrs(namePattern *regexp.Regexp) (addrs []net.Addr, err error) { + interfaces, err := net.Interfaces() + if err != nil { + return nil, err + } + + for _, inter := range interfaces { + if !namePattern.MatchString(inter.Name) { + continue + } + + interfaceAddrs, err := inter.Addrs() + if err != nil { + return nil, err + } + + for _, addr := range interfaceAddrs { + addrs = append(addrs, addr) + } + } + + return +}