gruik

Fork of GCU-Squad's RSS-to-IRC bridge
git clone https://git.instinctive.eu/gruik.git
Log | Files | Refs | README | LICENSE

commit 3e2e7cc2aaf59272f3889c594e4b3d2629d05943
parent b00450896733ff825538921421ababfb544d77b1
Author: Emile 'iMil' Heitor <imil@NetBSD.org>
Date:   Fri, 14 Jul 2023 12:16:04 +0200

feat: !latest private message with the latest news

Diffstat:
MREADME.md | 1+
Mmain.go | 59+++++++++++++++++++++++++++++++++++++++++++++++++----------
2 files changed, 50 insertions(+), 10 deletions(-)

diff --git a/README.md b/README.md @@ -62,6 +62,7 @@ For everybody: * `!lsfeeds` lists available RSS feeds, can be asked privately * `!xpost <news hash>` posts news with hash `<news hash>` to `xchannels` +* `!latest <number> [origin]` will post `number` of latest news from optional `origin` in a query message For ops: diff --git a/main.go b/main.go @@ -26,7 +26,7 @@ type News struct { const maxNews = 100 -var newslist []News +var newsList []News func mkHash(s1, s2 string) string { s := s1 + s2 @@ -36,7 +36,7 @@ func mkHash(s1, s2 string) string { } func newsExists(news News) bool { - for _, n := range newslist { + for _, n := range newsList { if n.Hash == news.Hash { return true } @@ -48,7 +48,7 @@ func getNewsByHash(hash string) News { if strings.Contains(hash, "#") { hash = hash[1:] } - for _, n := range newslist { + for _, n := range newsList { if n.Hash == hash { return n } @@ -56,6 +56,17 @@ func getNewsByHash(hash string) News { return News{} } +func getNewsByOrigin(origin string) []News { + resNews := []News{} + + for _, n := range newsList { + if n.Origin == origin { + resNews = append(resNews, n) + } + } + return resNews +} + func fmtNews(news News) string { return fmt.Sprintf("[{%s}%s{r}] {%s}%s{r} {%s}%s{r} {%s}#%s{r}", viper.GetString("irc.colors.origin"), @@ -71,7 +82,7 @@ func fmtNews(news News) string { // Fetch and post news from RSS feeds func newsFetch(client *girc.Client, channel string) { - newslist = make([]News, 0) + newsList = make([]News, 0) for { if client.IsConnected() && len(client.ChannelList()) != 0 { @@ -91,7 +102,7 @@ func newsFetch(client *girc.Client, channel string) { defer f.Close() // read news from disk decoder := json.NewDecoder(f) - if err := decoder.Decode(&newslist); err != nil { + if err := decoder.Decode(&newsList); err != nil { client.Cmd.Message(channel, "could not load news list, empty?") } @@ -134,10 +145,10 @@ func newsFetch(client *girc.Client, channel string) { time.Sleep(viper.GetDuration("irc.delay")) // Mark item as posted - if len(newslist) < maxNews { - newslist = append(newslist, news) + if len(newsList) < maxNews { + newsList = append(newsList, news) } else { - newslist = append(newslist[1:], news) + newsList = append(newsList[1:], news) } } } @@ -149,8 +160,8 @@ func newsFetch(client *girc.Client, channel string) { log.Fatal(err) } encoder := json.NewEncoder(f) - if err = encoder.Encode(newslist); err != nil { - client.Cmd.Message(channel, "could write newslist") + if err = encoder.Encode(newsList); err != nil { + client.Cmd.Message(channel, "could write newsList") } time.Sleep(viper.GetDuration("feeds.frequency")) } @@ -313,6 +324,34 @@ func main() { } } } + if strings.HasPrefix(e.Last(), "!latest") && e.Params[0] != channel { + numNews := len(newsList) + if numNews < 1 { + c.Cmd.Message(dest, "no news available") + return + } + p := strings.SplitN(e.Last(), " ", 3) + if len(p) < 2 { + c.Cmd.Message(dest, "usage: !latest <number> [origin]") + return + } + n, err := strconv.Atoi(p[1]) + if err != nil { + c.Cmd.Message(dest, "conversion error") + return + } + showNews := newsList + if len(p) > 2 { + showNews = getNewsByOrigin(p[2]) + numNews = len(showNews) + } + if n > numNews { + n = numNews + } + for i := 0; i < n; i++ { + c.Cmd.Message(dest, girc.Fmt(fmtNews(showNews[i]))) + } + } }) go newsFetch(client, channel)