Changeset 178 in code for trunk/upstream.go
- Timestamp:
- Mar 27, 2020, 11:07:20 PM (5 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/upstream.go
r177 r178 8 8 "io" 9 9 "net" 10 "os" 11 "path/filepath" 10 12 "strconv" 11 13 "strings" … … 64 66 // access is synchronized with user.pendingLISTsLock 65 67 pendingLISTDownstreamSet map[uint64]struct{} 68 69 logs map[string]entityLog 70 } 71 72 type entityLog struct { 73 name string 74 file *os.File 66 75 } 67 76 … … 98 107 availableMemberships: stdMemberships, 99 108 pendingLISTDownstreamSet: make(map[uint64]struct{}), 109 logs: make(map[string]entityLog), 100 110 } 101 111 … … 142 152 } 143 153 close(uc.closed) 144 154 for _, log := range uc.logs { 155 log.file.Close() 156 } 145 157 uc.endPendingLists(true) 146 158 return nil … … 313 325 return err 314 326 } 327 328 target := nick 329 if nick == uc.nick { 330 target = msg.Prefix.Name 331 } 332 uc.AppendLog(target, "<%s> %s", msg.Prefix.Name, text) 315 333 316 334 uc.forEachDownstream(func(dc *downstreamConn) { … … 617 635 delete(ch.Members, msg.Prefix.Name) 618 636 ch.Members[newNick] = membership 637 uc.AppendLog(ch.Name, "*** %s is now known as %s", msg.Prefix.Name, newNick) 619 638 } 620 639 } … … 660 679 } 661 680 681 uc.AppendLog(ch, "*** Joins: %s (%s@%s)", msg.Prefix.Name, msg.Prefix.User, msg.Prefix.Host) 682 662 683 uc.forEachDownstream(func(dc *downstreamConn) { 663 684 dc.SendMessage(&irc.Message{ … … 676 697 if err := parseMessageParams(msg, &channels); err != nil { 677 698 return err 699 } 700 701 var reason string 702 if len(msg.Params) > 1 { 703 reason = msg.Params[1] 678 704 } 679 705 … … 690 716 } 691 717 718 uc.AppendLog(ch, "*** Parts: %s (%s@%s) (%s)", msg.Prefix.Name, msg.Prefix.User, msg.Prefix.Host, reason) 719 692 720 uc.forEachDownstream(func(dc *downstreamConn) { 693 721 dc.SendMessage(&irc.Message{ … … 724 752 } 725 753 754 uc.AppendLog(channel, "*** %s was kicked by %s (%s)", user, msg.Prefix.Name, reason) 755 726 756 uc.forEachDownstream(func(dc *downstreamConn) { 727 757 params := []string{dc.marshalChannel(uc, channel), dc.marshalNick(uc, user)} … … 740 770 } 741 771 772 var reason string 773 if len(msg.Params) > 0 { 774 reason = msg.Params[0] 775 } 776 742 777 if msg.Prefix.Name == uc.nick { 743 778 uc.logger.Printf("quit") … … 745 780 746 781 for _, ch := range uc.channels { 747 delete(ch.Members, msg.Prefix.Name) 782 if _, ok := ch.Members[msg.Prefix.Name]; ok { 783 delete(ch.Members, msg.Prefix.Name) 784 785 uc.AppendLog(ch.Name, "*** Quits: %s (%s@%s) (%s)", msg.Prefix.Name, msg.Prefix.User, msg.Prefix.Host, reason) 786 } 748 787 } 749 788 … … 819 858 } 820 859 } 860 861 modeMsg := modeStr 862 for _, v := range msg.Params[2:] { 863 modeMsg += " " + v 864 } 865 uc.AppendLog(ch.Name, "*** %s sets mode: %s", msg.Prefix.Name, modeMsg) 821 866 822 867 uc.forEachDownstream(func(dc *downstreamConn) { … … 1153 1198 } 1154 1199 1155 var nick string1156 if err := parseMessageParams(msg, &nick, nil); err != nil {1200 var nick, text string 1201 if err := parseMessageParams(msg, &nick, &text); err != nil { 1157 1202 return err 1158 1203 } … … 1166 1211 break 1167 1212 } 1213 1214 target := nick 1215 if nick == uc.nick { 1216 target = msg.Prefix.Name 1217 } 1218 uc.AppendLog(target, "<%s> %s", msg.Prefix.Name, text) 1168 1219 1169 1220 uc.network.ring.Produce(msg) … … 1364 1415 uc.SendMessage(msg) 1365 1416 } 1417 1418 // TODO: handle moving logs when a network name changes, when support for this is added 1419 func (uc *upstreamConn) AppendLog(entity string, format string, a ...interface{}) { 1420 if uc.srv.LogPath == "" { 1421 return 1422 } 1423 // TODO: enforce maximum open file handles (LRU cache of file handles) 1424 // TODO: handle non-monotonic clock behaviour 1425 now := time.Now() 1426 year, month, day := now.Date() 1427 name := fmt.Sprintf("%04d-%02d-%02d.log", year, month, day) 1428 log, ok := uc.logs[entity] 1429 if !ok || log.name != name { 1430 if ok { 1431 log.file.Close() 1432 delete(uc.logs, entity) 1433 } 1434 // TODO: handle/forbid network/entity names with illegal path characters 1435 dir := filepath.Join(uc.srv.LogPath, uc.user.Username, uc.network.Name, entity) 1436 if err := os.MkdirAll(dir, 0600); err != nil { 1437 uc.logger.Printf("failed to log message: could not create logs directory %q: %v", dir, err) 1438 return 1439 } 1440 path := filepath.Join(dir, name) 1441 f, err := os.OpenFile(path, os.O_RDWR|os.O_CREATE|os.O_APPEND, 0600) 1442 if err != nil { 1443 uc.logger.Printf("failed to log message: could not open or create log file %q: %v", path, err) 1444 return 1445 } 1446 log = entityLog{ 1447 name: name, 1448 file: f, 1449 } 1450 uc.logs[entity] = log 1451 } 1452 1453 format = "[%02d:%02d:%02d] " + format + "\n" 1454 args := []interface{}{now.Hour(), now.Minute(), now.Second()} 1455 args = append(args, a...) 1456 1457 if _, err := fmt.Fprintf(log.file, format, args...); err != nil { 1458 uc.logger.Printf("failed to log message to %q: %v", log.name, err) 1459 } 1460 }
Note:
See TracChangeset
for help on using the changeset viewer.