- Timestamp:
- Apr 3, 2020, 4:59:17 PM (5 years ago)
- Location:
- trunk
- Files:
-
- 1 added
- 3 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/downstream.go
r213 r215 1233 1233 dc.lock.Unlock() 1234 1234 1235 uc.appendLog(upstreamName, "<%s> %s", uc.nick, text)1235 uc.appendLog(upstreamName, echoMsg) 1236 1236 1237 1237 uc.network.ring.Produce(echoMsg) -
trunk/upstream.go
r212 r215 9 9 "net" 10 10 "os" 11 "path/filepath"12 11 "strconv" 13 12 "strings" … … 63 62 pendingLISTDownstreamSet map[uint64]struct{} 64 63 65 logs map[string]entityLog64 messageLoggers map[string]*messageLogger 66 65 } 67 66 … … 98 97 availableMemberships: stdMemberships, 99 98 pendingLISTDownstreamSet: make(map[uint64]struct{}), 100 logs: make(map[string]entityLog),99 messageLoggers: make(map[string]*messageLogger), 101 100 } 102 101 … … 274 273 target = msg.Prefix.Name 275 274 } 276 uc.appendLog(target, "<%s> %s", msg.Prefix.Name, text)275 uc.appendLog(target, msg) 277 276 278 277 uc.forEachDownstream(func(dc *downstreamConn) { … … 579 578 delete(ch.Members, msg.Prefix.Name) 580 579 ch.Members[newNick] = membership 581 uc.appendLog(ch.Name, "*** %s is now known as %s", msg.Prefix.Name, newNick)580 uc.appendLog(ch.Name, msg) 582 581 } 583 582 } … … 623 622 } 624 623 625 uc.appendLog(ch, "*** Joins: %s (%s@%s)", msg.Prefix.Name, msg.Prefix.User, msg.Prefix.Host)624 uc.appendLog(ch, msg) 626 625 627 626 uc.forEachDownstream(func(dc *downstreamConn) { … … 660 659 } 661 660 662 uc.appendLog(ch, "*** Parts: %s (%s@%s) (%s)", msg.Prefix.Name, msg.Prefix.User, msg.Prefix.Host, reason)661 uc.appendLog(ch, msg) 663 662 664 663 uc.forEachDownstream(func(dc *downstreamConn) { 664 params := []string{dc.marshalChannel(uc, ch)} 665 if reason != "" { 666 params = append(params, reason) 667 } 665 668 dc.SendMessage(&irc.Message{ 666 669 Prefix: dc.marshalUserPrefix(uc, msg.Prefix), 667 670 Command: "PART", 668 Params: []string{dc.marshalChannel(uc, ch)},671 Params: params, 669 672 }) 670 673 }) … … 682 685 var reason string 683 686 if len(msg.Params) > 2 { 684 reason = msg.Params[ 1]687 reason = msg.Params[2] 685 688 } 686 689 … … 696 699 } 697 700 698 uc.appendLog(channel, "*** %s was kicked by %s (%s)", user, msg.Prefix.Name, reason)701 uc.appendLog(channel, msg) 699 702 700 703 uc.forEachDownstream(func(dc *downstreamConn) { … … 714 717 } 715 718 716 var reason string717 if len(msg.Params) > 0 {718 reason = msg.Params[0]719 }720 721 719 if msg.Prefix.Name == uc.nick { 722 720 uc.logger.Printf("quit") … … 727 725 delete(ch.Members, msg.Prefix.Name) 728 726 729 uc.appendLog(ch.Name, "*** Quits: %s (%s@%s) (%s)", msg.Prefix.Name, msg.Prefix.User, msg.Prefix.Host, reason)727 uc.appendLog(ch.Name, msg) 730 728 } 731 729 } … … 803 801 } 804 802 805 modeMsg := modeStr 806 for _, v := range msg.Params[2:] { 807 modeMsg += " " + v 808 } 809 uc.appendLog(ch.Name, "*** %s sets mode: %s", msg.Prefix.Name, modeMsg) 803 uc.appendLog(ch.Name, msg) 810 804 811 805 uc.forEachDownstream(func(dc *downstreamConn) { … … 1164 1158 target = msg.Prefix.Name 1165 1159 } 1166 uc.appendLog(target, "<%s> %s", msg.Prefix.Name, text)1160 uc.appendLog(target, msg) 1167 1161 1168 1162 uc.network.ring.Produce(msg) … … 1378 1372 1379 1373 // TODO: handle moving logs when a network name changes, when support for this is added 1380 func (uc *upstreamConn) appendLog(entity string, format string, a ...interface{}) {1374 func (uc *upstreamConn) appendLog(entity string, msg *irc.Message) { 1381 1375 if uc.srv.LogPath == "" { 1382 1376 return 1383 1377 } 1384 // TODO: enforce maximum open file handles (LRU cache of file handles) 1385 // TODO: handle non-monotonic clock behaviour 1386 now := time.Now() 1387 year, month, day := now.Date() 1388 name := fmt.Sprintf("%04d-%02d-%02d.log", year, month, day) 1389 log, ok := uc.logs[entity] 1390 if !ok || log.name != name { 1391 if ok { 1392 log.file.Close() 1393 delete(uc.logs, entity) 1394 } 1395 // TODO: handle/forbid network/entity names with illegal path characters 1396 dir := filepath.Join(uc.srv.LogPath, uc.user.Username, uc.network.Name, entity) 1397 if err := os.MkdirAll(dir, 0700); err != nil { 1398 uc.logger.Printf("failed to log message: could not create logs directory %q: %v", dir, err) 1399 return 1400 } 1401 path := filepath.Join(dir, name) 1402 f, err := os.OpenFile(path, os.O_RDWR|os.O_CREATE|os.O_APPEND, 0600) 1403 if err != nil { 1404 uc.logger.Printf("failed to log message: could not open or create log file %q: %v", path, err) 1405 return 1406 } 1407 log = entityLog{ 1408 name: name, 1409 file: f, 1410 } 1411 uc.logs[entity] = log 1412 } 1413 1414 format = "[%02d:%02d:%02d] " + format + "\n" 1415 args := []interface{}{now.Hour(), now.Minute(), now.Second()} 1416 args = append(args, a...) 1417 1418 if _, err := fmt.Fprintf(log.file, format, args...); err != nil { 1419 uc.logger.Printf("failed to log message to %q: %v", log.name, err) 1378 1379 ml, ok := uc.messageLoggers[entity] 1380 if !ok { 1381 ml = newMessageLogger(uc, entity) 1382 uc.messageLoggers[entity] = ml 1383 } 1384 1385 if err := ml.Append(msg); err != nil { 1386 uc.logger.Printf("failed to log message: %v", err) 1420 1387 } 1421 1388 } -
trunk/user.go
r204 r215 208 208 uc.network.lock.Unlock() 209 209 210 for _, log := range uc.logs { 211 log.file.Close() 210 for _, ml := range uc.messageLoggers { 211 if err := ml.Close(); err != nil { 212 uc.logger.Printf("failed to close message logger: %v", err) 213 } 212 214 } 213 215
Note:
See TracChangeset
for help on using the changeset viewer.