Changeset 665 in code for trunk/msgstore_fs.go
- Timestamp:
- Nov 3, 2021, 2:17:16 PM (4 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/msgstore_fs.go
r644 r665 250 250 } 251 251 252 func parseMessage(line, entity string, ref time.Time ) (*irc.Message, time.Time, error) {252 func parseMessage(line, entity string, ref time.Time, events bool) (*irc.Message, time.Time, error) { 253 253 var hour, minute, second int 254 254 _, err := fmt.Sscanf(line, "[%02d:%02d:%02d] ", &hour, &minute, &second) … … 258 258 line = line[11:] 259 259 260 var cmd, sender, text string 261 if strings.HasPrefix(line, "<") { 262 cmd = "PRIVMSG" 263 parts := strings.SplitN(line[1:], "> ", 2) 260 var cmd string 261 var prefix *irc.Prefix 262 var params []string 263 if events && strings.HasPrefix(line, "*** ") { 264 parts := strings.SplitN(line[4:], " ", 2) 264 265 if len(parts) != 2 { 265 266 return nil, time.Time{}, nil 266 267 } 267 sender, text = parts[0], parts[1] 268 } else if strings.HasPrefix(line, "-") { 269 cmd = "NOTICE" 270 parts := strings.SplitN(line[1:], "- ", 2) 271 if len(parts) != 2 { 268 switch parts[0] { 269 case "Joins:", "Parts:", "Quits:": 270 args := strings.SplitN(parts[1], " ", 3) 271 if len(args) < 2 { 272 return nil, time.Time{}, nil 273 } 274 nick := args[0] 275 mask := strings.TrimSuffix(strings.TrimPrefix(args[1], "("), ")") 276 maskParts := strings.SplitN(mask, "@", 2) 277 if len(maskParts) != 2 { 278 return nil, time.Time{}, nil 279 } 280 prefix = &irc.Prefix{ 281 Name: nick, 282 User: maskParts[0], 283 Host: maskParts[1], 284 } 285 var reason string 286 if len(args) > 2 { 287 reason = strings.TrimSuffix(strings.TrimPrefix(args[2], "("), ")") 288 } 289 switch parts[0] { 290 case "Joins:": 291 cmd = "JOIN" 292 params = []string{entity} 293 case "Parts:": 294 cmd = "PART" 295 if reason != "" { 296 params = []string{entity, reason} 297 } else { 298 params = []string{entity} 299 } 300 case "Quits:": 301 cmd = "QUIT" 302 if reason != "" { 303 params = []string{reason} 304 } 305 } 306 default: 307 nick := parts[0] 308 rem := parts[1] 309 if r := strings.TrimPrefix(rem, "is now known as "); r != rem { 310 cmd = "NICK" 311 prefix = &irc.Prefix{ 312 Name: nick, 313 } 314 params = []string{r} 315 } else if r := strings.TrimPrefix(rem, "was kicked by "); r != rem { 316 args := strings.SplitN(r, " ", 2) 317 if len(args) != 2 { 318 return nil, time.Time{}, nil 319 } 320 cmd = "KICK" 321 prefix = &irc.Prefix{ 322 Name: args[0], 323 } 324 reason := strings.TrimSuffix(strings.TrimPrefix(args[1], "("), ")") 325 params = []string{entity, nick} 326 if reason != "" { 327 params = append(params, reason) 328 } 329 } else if r := strings.TrimPrefix(rem, "changes topic to "); r != rem { 330 cmd = "TOPIC" 331 prefix = &irc.Prefix{ 332 Name: nick, 333 } 334 topic := strings.TrimSuffix(strings.TrimPrefix(r, "'"), "'") 335 params = []string{entity, topic} 336 } else if r := strings.TrimPrefix(rem, "sets mode: "); r != rem { 337 cmd = "MODE" 338 prefix = &irc.Prefix{ 339 Name: nick, 340 } 341 params = append([]string{entity}, strings.Split(r, " ")...) 342 } else { 343 return nil, time.Time{}, nil 344 } 345 } 346 } else { 347 var sender, text string 348 if strings.HasPrefix(line, "<") { 349 cmd = "PRIVMSG" 350 parts := strings.SplitN(line[1:], "> ", 2) 351 if len(parts) != 2 { 352 return nil, time.Time{}, nil 353 } 354 sender, text = parts[0], parts[1] 355 } else if strings.HasPrefix(line, "-") { 356 cmd = "NOTICE" 357 parts := strings.SplitN(line[1:], "- ", 2) 358 if len(parts) != 2 { 359 return nil, time.Time{}, nil 360 } 361 sender, text = parts[0], parts[1] 362 } else if strings.HasPrefix(line, "* ") { 363 cmd = "PRIVMSG" 364 parts := strings.SplitN(line[2:], " ", 2) 365 if len(parts) != 2 { 366 return nil, time.Time{}, nil 367 } 368 sender, text = parts[0], "\x01ACTION "+parts[1]+"\x01" 369 } else { 272 370 return nil, time.Time{}, nil 273 371 } 274 sender, text = parts[0], parts[1] 275 } else if strings.HasPrefix(line, "* ") { 276 cmd = "PRIVMSG" 277 parts := strings.SplitN(line[2:], " ", 2) 278 if len(parts) != 2 { 279 return nil, time.Time{}, nil 280 } 281 sender, text = parts[0], "\x01ACTION "+parts[1]+"\x01" 282 } else { 283 return nil, time.Time{}, nil 372 373 prefix = &irc.Prefix{Name: sender} 374 params = []string{entity, text} 284 375 } 285 376 … … 291 382 "time": irc.TagValue(t.UTC().Format(serverTimeLayout)), 292 383 }, 293 Prefix: &irc.Prefix{Name: sender},384 Prefix: prefix, 294 385 Command: cmd, 295 Params: []string{entity, text},386 Params: params, 296 387 } 297 388 return msg, t, nil 298 389 } 299 390 300 func (ms *fsMessageStore) parseMessagesBefore(network *network, entity string, ref time.Time, end time.Time, limit int, afterOffset int64) ([]*irc.Message, error) {391 func (ms *fsMessageStore) parseMessagesBefore(network *network, entity string, ref time.Time, end time.Time, events bool, limit int, afterOffset int64) ([]*irc.Message, error) { 301 392 path := ms.logPath(network, entity, ref) 302 393 f, err := os.Open(path) … … 322 413 323 414 for sc.Scan() { 324 msg, t, err := parseMessage(sc.Text(), entity, ref )415 msg, t, err := parseMessage(sc.Text(), entity, ref, events) 325 416 if err != nil { 326 417 return nil, err … … 354 445 } 355 446 356 func (ms *fsMessageStore) parseMessagesAfter(network *network, entity string, ref time.Time, end time.Time, limit int) ([]*irc.Message, error) {447 func (ms *fsMessageStore) parseMessagesAfter(network *network, entity string, ref time.Time, end time.Time, events bool, limit int) ([]*irc.Message, error) { 357 448 path := ms.logPath(network, entity, ref) 358 449 f, err := os.Open(path) … … 368 459 sc := bufio.NewScanner(f) 369 460 for sc.Scan() && len(history) < limit { 370 msg, t, err := parseMessage(sc.Text(), entity, ref )461 msg, t, err := parseMessage(sc.Text(), entity, ref, events) 371 462 if err != nil { 372 463 return nil, err … … 386 477 } 387 478 388 func (ms *fsMessageStore) LoadBeforeTime(network *network, entity string, start time.Time, end time.Time, limit int ) ([]*irc.Message, error) {479 func (ms *fsMessageStore) LoadBeforeTime(network *network, entity string, start time.Time, end time.Time, limit int, events bool) ([]*irc.Message, error) { 389 480 start = start.In(time.Local) 390 481 end = end.In(time.Local) … … 393 484 tries := 0 394 485 for remaining > 0 && tries < fsMessageStoreMaxTries && end.Before(start) { 395 buf, err := ms.parseMessagesBefore(network, entity, start, end, remaining, -1)486 buf, err := ms.parseMessagesBefore(network, entity, start, end, events, remaining, -1) 396 487 if err != nil { 397 488 return nil, err … … 411 502 } 412 503 413 func (ms *fsMessageStore) LoadAfterTime(network *network, entity string, start time.Time, end time.Time, limit int ) ([]*irc.Message, error) {504 func (ms *fsMessageStore) LoadAfterTime(network *network, entity string, start time.Time, end time.Time, limit int, events bool) ([]*irc.Message, error) { 414 505 start = start.In(time.Local) 415 506 end = end.In(time.Local) … … 418 509 tries := 0 419 510 for remaining > 0 && tries < fsMessageStoreMaxTries && start.Before(end) { 420 buf, err := ms.parseMessagesAfter(network, entity, start, end, remaining)511 buf, err := ms.parseMessagesAfter(network, entity, start, end, events, remaining) 421 512 if err != nil { 422 513 return nil, err … … 461 552 } 462 553 463 buf, err := ms.parseMessagesBefore(network, entity, t, time.Time{}, remaining, offset)554 buf, err := ms.parseMessagesBefore(network, entity, t, time.Time{}, false, remaining, offset) 464 555 if err != nil { 465 556 return nil, err … … 479 570 } 480 571 481 func (ms *fsMessageStore) ListTargets(network *network, start, end time.Time, limit int ) ([]chatHistoryTarget, error) {572 func (ms *fsMessageStore) ListTargets(network *network, start, end time.Time, limit int, events bool) ([]chatHistoryTarget, error) { 482 573 start = start.In(time.Local) 483 574 end = end.In(time.Local)
Note:
See TracChangeset
for help on using the changeset viewer.