1 Star 0 Fork 0

liuxuezhan / mylib

加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
克隆/下载
main.go 4.93 KB
一键复制 编辑 原始数据 按行查看 历史
liuxuezhan 提交于 2020-10-14 10:09 . 'new mylib'
package main
import (
"fmt"
"io/ioutil"
"net"
"net/http"
_ "net/http/pprof"
"os"
"path/filepath"
"regexp"
"strings"
"sync"
"time"
"gitee.com/liuxuezhan/mylib/cloudcade/filter"
"gitee.com/liuxuezhan/mylib/db"
)
type info struct {
conn net.Conn
name string
tm int64
}
type popular struct {
popular string
tm int64
}
var ch_all chan string = make(chan string)
var ch_one chan string = make(chan string)
var ch_who chan string = make(chan string)
var infos2 sync.Map
var list50 = &ST_list50{list: make([]string, 0)}
var DB = db.Session{}
type ST_list50 struct {
list []string
sync.RWMutex
}
func Writelist50(msg string) {
list50.Lock()
defer list50.Unlock()
if len(list50.list) < 50 {
list50.list = append(list50.list, msg)
} else {
list50.list = append(list50.list[1:], msg)
}
}
func Readlist50() (msg1 string) {
list50.RLock()
defer list50.RUnlock()
for _, val := range list50.list {
msg1 += "\n" + val
}
return msg1
}
func handle(conn net.Conn) {
defer conn.Close()
buf := make([]byte, 100)
n, err := conn.Read(buf)
if err != nil {
return
}
name := string(buf[:n])
var oneinfo info
oneinfo.conn = conn
oneinfo.name = name
oneinfo.tm = filter.GetTime()
addr := conn.RemoteAddr().String()
if _, ok := infos2.Load(name); ok {
return
}
infos2.Store(name, oneinfo)
msg := name + "进入聊天室"
ch_all <- msg
msg1 := Readlist50()
if msg1 != "" {
ch_who <- name
ch_one <- msg1 //单发
}
for {
n, err := conn.Read(buf)
if n == 0 || err != nil {
fmt.Printf("%s断开连接\n", addr)
msg = name + "离开聊天室"
infos2.Delete(name)
ch_all <- msg
fmt.Println(msg)
return
}
Rev(name, string(buf[:n]), n)
}
}
func ConvertToString(in interface{}) string {
var retval string
switch in.(type) {
case int64:
retval = fmt.Sprintf("%d", in.(int64))
case string:
retval = in.(string)
case int:
retval = fmt.Sprintf("%d", in.(int))
case int32:
retval = fmt.Sprintf("%d", in.(int32))
case float32:
retval = fmt.Sprintf("%d", int64(in.(float32)))
case float64:
retval = fmt.Sprintf("%d", int64(in.(float64)))
case []byte:
retval = string(in.([]byte))
case uint64:
retval = fmt.Sprintf("%d", in.(uint64))
case uint32:
retval = fmt.Sprintf("%d", in.(uint32))
default:
retval = ""
}
return retval
}
func Rev(name, msg string, n int) string {
buf := []byte(msg)
if buf[0] == '@' {
sli := strings.Fields(string(buf[1:n])) //隔开
who := sli[0]
msg = strings.Join(sli[1:], "") //后边的再拼接回去
msg = filter.FilterChack(msg)
ch_who <- who
ch_one <- name + "->me : " + msg //单发
return msg
}
a := strings.Split(msg, " ")
if len(a) == 2 && a[0] == "/status" {
if v, ok := infos2.Load(a[1]); ok {
ch_who <- a[1]
msg = time.Unix(v.(info).tm, 0).Format(time.RFC3339)
ch_one <- msg
return msg
}
return ""
}
if a[0] == "/popular" {
popular := ""
//var ret map[string]int
//query :=bson.M{"$gt": bson.M{"tm": filter.GetTime()-5}}
//job := &mgo.MapReduce{
// Map: "function() { emit(this.popular, 1) }",
// Reduce: "function(key, values) { return Array.sum(values) }",
// Out: "res",
//}
//DB.MapReduce("user",query,job,&ret)
//max:=0
//for k, v := range ret {
// if v>max {
// max = v
// popular = k
// }
//}
return popular
}
msg = filter.FilterChack(msg)
filter.GetTime()
ret := msg
msg = name + "->all : " + msg //群发
regExp := regexp.MustCompile("[\\pP|\\pS]")
values := regExp.FindAllString(name, -1)
if nil != values && 0 != len(values) {
return ""
}
go Writelist50(msg)
//to do 利用mongo MapReduce 统计热词
// go DB.Write("user",bson.NewObjectId(),&popular{msg,filter.GetTime()})
ch_all <- msg
return ret
}
func sendone() {
for {
who := <-ch_who
msg := <-ch_one
if v, ok := infos2.Load(who); ok {
v.(info).conn.Write([]byte(msg))
}
}
}
func sendall() {
for {
msg := <-ch_all
f := func(k, val interface{}) bool {
val.(info).conn.Write([]byte(msg))
return true
}
infos2.Range(f)
}
}
func GetFileContentAsStringLines(filePath string) ([]string, error) {
result := []string{}
b, err := ioutil.ReadFile(filePath)
if err != nil {
return result, err
}
s := string(b)
for _, lineStr := range strings.Split(s, "\n") {
lineStr = strings.TrimSpace(lineStr)
if lineStr == "" {
continue
}
result = append(result, lineStr)
}
return result, nil
}
func GetCurDir() string {
dir, err := filepath.Abs(filepath.Dir(os.Args[0]))
if err != nil {
return ""
}
//dir ="C:/arron/bin"
return strings.Replace(dir, "\\", "/", -1)
}
func main() {
go func() {
http.ListenAndServe(":6000", nil) //pprof
}()
DB.Open("127.0.0.1:27017", "wanyu")
filter.ConfExample = filter.InitConfigFilter(GetCurDir())
if len(filter.ConfExample.FilterList) == 0 {
return
}
listener, _ := net.Listen("tcp", ":9009")
defer listener.Close()
go sendall()
go sendone()
for {
conn, _ := listener.Accept()
fmt.Printf("%s建立连接\n", conn.RemoteAddr().String())
go handle(conn)
}
}
马建仓 AI 助手
尝试更多
代码解读
代码找茬
代码优化
1
https://gitee.com/liuxuezhan/mylib.git
git@gitee.com:liuxuezhan/mylib.git
liuxuezhan
mylib
mylib
v1.1.0

搜索帮助

344bd9b3 5694891 D2dac590 5694891