Skip to content

Commit c527453

Browse files
committed
Konkked Initial Submission
just basic version of it want to see if I can get some parallel code working
1 parent 6dfd8e8 commit c527453

File tree

3 files changed

+220
-0
lines changed

3 files changed

+220
-0
lines changed

konkked/README

+9
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
valid flags are
2+
3+
-room
4+
desc: room id to query
5+
default: current room with the most amount of people
6+
7+
-site the target site
8+
desc: the base site to target
9+
default: stackoverflow

konkked/main.go

+168
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,168 @@
1+
package main
2+
3+
import (
4+
"flag"
5+
"fmt"
6+
"github.com/PuerkitoBio/goquery"
7+
"log"
8+
"strconv"
9+
"strings"
10+
)
11+
12+
func main() {
13+
14+
var sitep = flag.String("site", "stackoverflow", "chat site's base url")
15+
var roomp = flag.Int("roomid", -1, "id of targeted chatroom")
16+
17+
flag.Parse()
18+
19+
var site = *sitep
20+
var room = *roomp
21+
22+
log.Printf("Targeting Site : %s \n", site)
23+
24+
if room < 0 {
25+
26+
var roomselectfmt string = "http://chat.%s.com/rooms/?tab=all&sort=people"
27+
28+
target := fmt.Sprintf(roomselectfmt, site)
29+
30+
log.Printf("Attempting to resolve target room id\n")
31+
log.Printf("Target Endpoint : %s\n", target)
32+
33+
findPage, err := goquery.NewDocument(target)
34+
35+
if err != nil {
36+
log.Fatal(err)
37+
}
38+
39+
var roomidquery = "[id^=\"room-\"]"
40+
41+
var node = findPage.Find(roomidquery).First()
42+
43+
if node == nil {
44+
log.Fatal("no matching rooms found at the requested page")
45+
}
46+
47+
var roomidattr, exists = node.Attr("id")
48+
49+
if !exists {
50+
log.Fatal("no matching ref")
51+
}
52+
53+
var idsplit = strings.Split(roomidattr, "-")
54+
55+
room, err = strconv.Atoi(idsplit[1])
56+
57+
if err != nil {
58+
log.Fatal(err)
59+
}
60+
61+
}
62+
63+
log.Printf("Targeting Room : %d \n", room)
64+
65+
baseurl := "http://chat.%s.com/rooms/info/%d/%s"
66+
67+
currurl := fmt.Sprintf(baseurl, site, room, "?tab=stars")
68+
69+
log.Printf("Targeting Endpoint :%s", currurl)
70+
71+
currpage, err := goquery.NewDocument(currurl)
72+
73+
if err != nil {
74+
log.Fatal(err)
75+
}
76+
77+
storagep := MakePersonMap()
78+
79+
var lasttext = currpage.Find("div.pager span.page-numbers.dots + a span.page-numbers").First().Text()
80+
var last, errlast = strconv.Atoi(lasttext)
81+
82+
if errlast != nil {
83+
log.Fatalf("Unable to determine last index")
84+
}
85+
var index = 1
86+
87+
log.Printf("Parsing %d Pages\n", last)
88+
89+
for {
90+
91+
msgquery := "#content > .monologue"
92+
starquery := " .messages .flash > .stars > .times"
93+
userquery := ".signature > .tiny-signature > .username > a"
94+
95+
currpage.Find(msgquery).Each(func(i int, s *goquery.Selection) {
96+
starvalue := 1
97+
98+
star := s.Find(starquery).Text()
99+
100+
if star != "" {
101+
starvalue, err = strconv.Atoi(star)
102+
103+
if err != nil {
104+
log.Fatal(err)
105+
}
106+
}
107+
108+
username := s.Find(userquery).Text()
109+
110+
_, ok := storagep[username]
111+
112+
if !ok {
113+
storagep[username] = &Person{name: username, stars: 0}
114+
}
115+
116+
storagep[username].stars += starvalue
117+
})
118+
119+
index++
120+
121+
if index > last {
122+
log.Printf("finished traversing lists")
123+
break
124+
}
125+
126+
nextlnk := fmt.Sprintf("?tab=stars&page=%d", index)
127+
currurl = fmt.Sprintf(baseurl, site, room, nextlnk)
128+
129+
currpage, err = goquery.NewDocument(currurl)
130+
131+
if err != nil {
132+
log.Fatal(err)
133+
break
134+
}
135+
136+
}
137+
138+
var values []*Person
139+
140+
for key := range storagep {
141+
values = append(values, storagep[key])
142+
}
143+
144+
stars := func(person1, person2 *Person) bool {
145+
146+
if person1.stars > person2.stars {
147+
return true
148+
}
149+
150+
if person1.stars == person2.stars && person1.name < person2.name {
151+
return true
152+
}
153+
154+
return false
155+
}
156+
157+
By(stars).Sort(values)
158+
159+
var jsonppl []string
160+
161+
for _, person := range values {
162+
jsonppl = append(jsonppl, fmt.Sprintf("{ \"username\" : \"%s\" , \"stars\" : %d }", person.name, person.stars))
163+
}
164+
165+
jsonresult := strings.Join(jsonppl, ",\n\t")
166+
167+
log.Print("[\n\t", jsonresult, "\n]")
168+
}

konkked/personmap.go

+43
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
package main
2+
3+
import (
4+
"sort"
5+
)
6+
7+
type By func(p1, p2 *Person) bool
8+
9+
type Person struct {
10+
name string
11+
stars int
12+
}
13+
14+
type peopleSorter struct {
15+
people []*Person
16+
by By
17+
}
18+
19+
type PersonMap map[string]*Person
20+
21+
func (by By) Sort(people []*Person) {
22+
ps := &peopleSorter{people: people, by: by}
23+
24+
sort.Sort(ps)
25+
}
26+
27+
func (s *peopleSorter) Len() int {
28+
return len(s.people)
29+
}
30+
31+
func (s *peopleSorter) Swap(i, j int) {
32+
s.people[i], s.people[j] = s.people[j], s.people[i]
33+
}
34+
35+
func (s *peopleSorter) Less(i, j int) bool {
36+
return s.by(s.people[i], s.people[j])
37+
}
38+
39+
func MakePersonMap() PersonMap {
40+
retv := make(map[string]*Person)
41+
var vl = PersonMap(retv)
42+
return vl
43+
}

0 commit comments

Comments
 (0)