/
module_rfc.go
119 lines (99 loc) · 2.4 KB
/
module_rfc.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
package main
import (
"encoding/json"
"github.com/Sirupsen/logrus"
irc "github.com/fluffle/goirc/client"
"github.com/nemith/mipples/rfc"
"regexp"
"strings"
"time"
)
func init() {
module.Register("rfc", &RFCModule{})
}
type RFCConfig struct {
// Number of minutes between refreshing of the database
FetchInterval time.Duration `json:"fetch_interval"`
}
type RFCModule struct {
config *RFCConfig
}
var rfcRegexp = regexp.MustCompile(`(?i)\b(RFC\d+)\b`)
func (m *RFCModule) Init(c *irc.Conn, config json.RawMessage) {
err := json.Unmarshal(config, &m.config)
if err != nil {
panic(err)
}
go rfcFetchLoop(m.config.FetchInterval)
c.HandleBG("PRIVMSG", NewMatchAllHandler(rfcRegexp, m.rfcHandler))
}
func (m *RFCModule) rfcHandler(conn *irc.Conn, msg *Privmsg, matches [][]string) {
var rfcs []string
for _, match := range matches {
rfcs = append(rfcs, rfc.TrimDocID(strings.ToUpper(match[1])))
}
var rfcObjects []RFC
db.Where("doc_id in (?)", rfcs).Find(&rfcObjects)
if len(rfcObjects) < 1 {
log.WithFields(logrus.Fields{
"rfc": rfcs,
}).Info("RFC Record not found in db")
return
}
for _, rfcObject := range rfcObjects {
msg.Respond(conn, "%s: %s (%s %d) [%s] - %s",
rfcObject.DocId, rfcObject.Title, rfcObject.Month, rfcObject.Year,
rfcObject.Status, rfcObject.Url)
}
}
func rfcFetchLoop(interval time.Duration) {
for {
rfcFetcher()
time.Sleep(interval * time.Minute)
}
}
type RFC struct {
Id int64
DocId string `sql:"not null;unique"`
Title string
Abstract string
Month string
Year int
Status string
Url string
// Obsoletes RFC
// ObsoletedBy RFC
// UpdatedBy RFC
}
func (k RFC) TableName() string {
return "rfcs"
}
func rfcFetcher() error {
log.Debug("Fetching RFC Index")
rfcIndex, err := rfc.FetchAndParseIndex()
if err != nil {
log.WithFields(logrus.Fields{
"error": err,
}).Error("Failed to fetch and parse rfc index xml")
}
tx := db.Begin()
tx.DropTable(RFC{})
tx.CreateTable(RFC{})
for _, rfcEntry := range rfcIndex.RFCEntries {
log.WithFields(logrus.Fields{
"rfc": rfcEntry,
}).Debug("Inserting RFC into database")
rfcRow := RFC{
DocId: string(rfcEntry.DocID),
Title: rfcEntry.Title,
Abstract: string(rfcEntry.Abstract),
Month: rfcEntry.Month,
Year: rfcEntry.Year,
Status: rfcEntry.CurrentStatus,
Url: rfcEntry.HTMLURL(),
}
tx.Save(&rfcRow)
}
tx.Commit()
return nil
}