ソースを参照

список трупов

kpmy 9 年 前
コミット
b73bc8f478
7 ファイル変更91 行追加28 行削除
  1. 8 3
      bot.go
  2. 0 20
      log.go
  3. 1 1
      main.go
  4. 12 4
      neo.go
  5. 63 0
      room.go
  6. BIN
      static/img/deads.png
  7. 7 0
      tpl/stat.tpl

+ 8 - 3
bot.go

@@ -32,13 +32,14 @@ func bot(st stream.Stream) error {
 						user, _ = u.(string)
 					}
 					if e.Type == entity.GROUPCHAT {
-						posts.Lock()
+						room.Lock()
 						if sender != ME {
 							IncStat(user)
 							IncStatLen(user, e.Body)
+							room.Active(user)
 						}
-						posts.data = append(posts.data, Post{Nick: sender, User: user, Msg: e.Body})
-						posts.Unlock()
+						room.Grow(Post{Nick: sender, User: user, Msg: e.Body})
+						room.Unlock()
 					}
 					if sender != ME {
 						hookExec.NewEvent(hookexecutor.IncomingEvent{"message", map[string]string{"sender": sender, "body": e.Body}})
@@ -68,6 +69,10 @@ func bot(st stream.Stream) error {
 						if u, ok := um[sender]; ok {
 							user, _ = u.(string)
 						}
+						actors.With().Do(R(func(r *Room) (e error) {
+							r.User(user)
+							return
+						})).Run(room)
 						if show := firstByName(e.Model(), "show"); e.Model().Attr("type") == "" && (show == nil || show.ChildrenCount() == 0) { //онлаен тип
 							hookExec.NewEvent(hookexecutor.IncomingEvent{"presence", map[string]string{"sender": sender, "user": user}})
 						}

+ 0 - 20
log.go

@@ -1,20 +0,0 @@
-package main
-
-import (
-	"sync"
-)
-
-type (
-	Post struct {
-		User string
-		Nick string
-		Msg  string
-	}
-
-	Posts struct {
-		data []Post
-		sync.Mutex
-	}
-)
-
-var posts *Posts

+ 1 - 1
main.go

@@ -26,7 +26,7 @@ func init() {
 	flag.StringVar(&resource, "r", "go", "-r=resource")
 	flag.StringVar(&pwd, "p", "GogogOg0", "-p=password")
 	log.SetFlags(0)
-	posts = new(Posts)
+	room = room.New()
 }
 
 func main() {

+ 12 - 4
neo.go

@@ -16,6 +16,7 @@ type (
 	TplData struct {
 		Count *StatData
 		Total *StatData
+		Deads []*User
 	}
 
 	StatData struct {
@@ -53,15 +54,15 @@ func neo_server(wg *sync.WaitGroup) {
 	//app.Templates("tpl/*.tpl") //кэширует в этом месте и далее не загружает с диска, сука
 	app.Serve("/static", "static")
 	app.Get("/", func(ctx *neo.Ctx) (int, error) {
-		posts.Lock()
 		data := struct {
 			Posts []Post
 		}{}
-		for i := len(posts.data) - 1; i >= 0; i-- {
-			p := posts.data[i]
+		room.Lock()
+		for i := len(room.posts) - 1; i >= 0; i-- {
+			p := room.posts[i]
 			data.Posts = append(data.Posts, p)
 		}
-		posts.Unlock()
+		room.Unlock()
 
 		if t, err := loadTpl("log"); t != nil {
 			//ctx.Res.Tpl("log.tpl", data)
@@ -95,6 +96,13 @@ func neo_server(wg *sync.WaitGroup) {
 				data := &TplData{}
 				data.Count = conv(c)
 				data.Total = conv(t)
+				room.Lock()
+				for _, u := range room.users {
+					if !u.Active {
+						data.Deads = append(data.Deads, u)
+					}
+				}
+				room.Unlock()
 				var tpl *template.Template
 				if tpl, err = loadTpl("stat"); tpl != nil {
 					tpl.Execute(ctx.Res, data)

+ 63 - 0
room.go

@@ -0,0 +1,63 @@
+package main
+
+import (
+	"errors"
+	"sync"
+)
+
+type (
+	Post struct {
+		User string
+		Nick string
+		Msg  string
+	}
+
+	User struct {
+		Nick   string
+		Active bool
+	}
+
+	Room struct {
+		posts []Post
+		users map[string]*User
+		sync.Mutex
+	}
+)
+
+var room *Room
+
+func (r *Room) New() *Room {
+	r = new(Room)
+	r.users = make(map[string]*User)
+	return r
+}
+func (r *Room) Grow(p Post) {
+	r.posts = append(r.posts, p)
+}
+
+func (r *Room) User(user string) (u *User) {
+	ok := false
+	if u, ok = r.users[user]; !ok {
+		u = &User{Nick: user}
+		r.users[user] = u
+	}
+	return
+}
+
+func (r *Room) Active(user string) {
+	r.User(user).Active = true
+}
+
+func R(fn func(*Room) error) func(interface{}) (interface{}, error) {
+	return func(x interface{}) (ret interface{}, err error) {
+		if r, ok := x.(*Room); ok {
+			ret = r
+			r.Lock()
+			err = fn(r)
+			r.Unlock()
+		} else {
+			err = errors.New("unknown room")
+		}
+		return
+	}
+}

BIN
static/img/deads.png


+ 7 - 0
tpl/stat.tpl

@@ -42,6 +42,13 @@
 			</div>
 			<div id="chart-container" class="col">
 			</div>
+			<div id="deads-container">
+				<h2>трупы</h2>
+				<img src="/static/img/deads.png" /><br/>
+				{{range .Deads}}
+					<span><em>{{.Nick}}</em></span><br/>
+				{{end}}
+			</div>
 		</div>
 	</body>
 	<script type="text/javascript">