ticket.go 1.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788
  1. package ticket
  2. import (
  3. _ "embed"
  4. "encoding/json"
  5. "fmt"
  6. "github.com/google/uuid"
  7. "github.com/lithammer/shortuuid/v4"
  8. "github.com/sashabaranov/go-openai"
  9. "google.golang.org/protobuf/encoding/protojson"
  10. "time"
  11. )
  12. func New(id string) *Ticket {
  13. return &Ticket{
  14. Id: id,
  15. Thread: []*Message{},
  16. }
  17. }
  18. func NewId(suffix string) string {
  19. now := time.Now()
  20. return fmt.Sprintf("t%s%d%03d-%s",
  21. suffix,
  22. now.Year(),
  23. now.YearDay(),
  24. shortuuid.NewWithAlphabet("23456789abcdefghijkmnopqrstuvwxy"))
  25. }
  26. func (t *Ticket) Marshal() ([]byte, error) {
  27. return protojson.Marshal(t)
  28. }
  29. func (t *Ticket) AddMessage(m *Message) error {
  30. if m == nil {
  31. return fmt.Errorf("illegal argument: Message must not be a nil")
  32. }
  33. if m.TicketId == "" {
  34. m.TicketId = t.Id
  35. }
  36. if m.Id == "" {
  37. m.Id = uuid.NewString()
  38. }
  39. if m.Date == 0 {
  40. m.Date = time.Now().UnixMilli()
  41. }
  42. t.Thread = append(t.Thread, m)
  43. return nil
  44. }
  45. func (t *Ticket) AddGPTResponseMessage(src *openai.ChatCompletionChoice) (*Message, error) {
  46. var (
  47. message = &Message{
  48. Id: uuid.NewString(),
  49. TicketId: t.Id,
  50. Provider: MessageProvider_GptMessageProvider,
  51. Body: src.Message.Content,
  52. Date: time.Now().UnixMilli(),
  53. }
  54. buf []byte
  55. err error
  56. )
  57. if buf, err = json.Marshal(src); err != nil {
  58. return nil, err
  59. }
  60. message.Raw = string(buf)
  61. if err = t.AddMessage(message); err != nil {
  62. return nil, err
  63. }
  64. return message, nil
  65. }
  66. //goland:noinspection GoUnusedExportedFunction
  67. func Unmarshal(d []byte) (*Ticket, error) {
  68. t := &Ticket{}
  69. if err := protojson.Unmarshal(d, t); err != nil {
  70. return nil, err
  71. }
  72. return t, nil
  73. }