history.go 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117
  1. package history
  2. import (
  3. "database/sql"
  4. "encoding/json"
  5. "fmt"
  6. mysqlmgr "server/db/mysql"
  7. "server/msg"
  8. "strings"
  9. "time"
  10. )
  11. func AddHistory(room_info *msg.RoomInfo) (int64, error) {
  12. jsonData, err := json.Marshal(room_info)
  13. if err != nil {
  14. return 0, fmt.Errorf("failed to marshal room info: %v", err)
  15. }
  16. now := time.Now()
  17. room_id, err := mysqlmgr.Insert("INSERT INTO ludo_roominfo (create_time,room_info) VALUES (?,?)", now, jsonData)
  18. if err != nil {
  19. return 0, fmt.Errorf("failed to insert room info: %v", err)
  20. }
  21. var userIDs []string = make([]string, 0, 4)
  22. for _, v := range room_info.Colors {
  23. if !strings.Contains(v.MId, "robot") {
  24. userIDs = append(userIDs, v.MId)
  25. }
  26. }
  27. err = addUsersHistoryToRoom(room_id, userIDs)
  28. if err != nil {
  29. return 0, fmt.Errorf("addUsersToRoom failed to insert room info: %v", err)
  30. }
  31. return room_id, nil
  32. }
  33. func addUsersHistoryToRoom(roomID int64, userIDs []string) error {
  34. if len(userIDs) == 0 {
  35. return nil
  36. }
  37. query := "INSERT INTO ludo_history (create_time, room_id, user_id) VALUES "
  38. var args []interface{}
  39. now := time.Now() // Same timestamp for all entries
  40. for i, userID := range userIDs {
  41. if i > 0 {
  42. query += ", "
  43. }
  44. query += "(?, ?, ?)"
  45. args = append(args, now, roomID, userID)
  46. }
  47. _, err := mysqlmgr.Insert(query, args...)
  48. return err
  49. }
  50. type HistoryRecord struct {
  51. ID int `db:"id"`
  52. CreateTime time.Time `db:"create_time"`
  53. RoomID int `db:"room_id"`
  54. UserID string `db:"user_id"`
  55. }
  56. func GetHistoryByUserID(userID string) ([]*msg.HistoryRecord, error) {
  57. rows, err := mysqlmgr.Query("SELECT id, create_time, room_id, user_id FROM ludo_history WHERE user_id = ?", userID)
  58. if err != nil {
  59. return nil, fmt.Errorf("query failed: %v", err)
  60. }
  61. defer rows.Close()
  62. var results []*msg.HistoryRecord
  63. for rows.Next() {
  64. var record HistoryRecord
  65. if err := rows.Scan(&record.ID, &record.CreateTime, &record.RoomID, &record.UserID); err != nil {
  66. return nil, fmt.Errorf("failed to scan row: %v", err)
  67. }
  68. results = append(results, &msg.HistoryRecord{
  69. Id: int32(record.ID),
  70. RoomId: int32(record.RoomID),
  71. UserId: record.UserID,
  72. })
  73. }
  74. if err := rows.Err(); err != nil {
  75. return nil, fmt.Errorf("rows error: %v", err)
  76. }
  77. return results, nil
  78. }
  79. func GetRoomInfoByID(id int) (*msg.RoomInfo, error) {
  80. // Query the database
  81. row := mysqlmgr.QueryRow("SELECT room_info FROM ludo_roominfo WHERE id = ?", id)
  82. // This will hold the raw JSON data from the database
  83. var jsonData []byte
  84. // Scan the result into jsonData
  85. if err := row.Scan(&jsonData); err != nil {
  86. if err == sql.ErrNoRows {
  87. return nil, fmt.Errorf("room info not found for id %d", id)
  88. }
  89. return nil, fmt.Errorf("failed to scan room info: %v", err)
  90. }
  91. // Unmarshal the JSON into RoomInfo struct
  92. var roomInfo msg.RoomInfo
  93. if err := json.Unmarshal(jsonData, &roomInfo); err != nil {
  94. return nil, fmt.Errorf("failed to unmarshal room info: %v", err)
  95. }
  96. return &roomInfo, nil
  97. }