Du kannst nicht mehr als 25 Themen auswählen Themen müssen entweder mit einem Buchstaben oder einer Ziffer beginnen. Sie können Bindestriche („-“) enthalten und bis zu 35 Zeichen lang sein.

100 Zeilen
2.4KB

  1. package main
  2. import (
  3. "encoding/json"
  4. "io/ioutil"
  5. "log"
  6. "os"
  7. "time"
  8. )
  9. //chat state that we might be use for collecting infomation from user
  10. type chatState struct {
  11. //back pointer style information, managed by general process
  12. OpenID string `json:"OpenID"` //whom is this belongs to
  13. Procedure string `json:"Procedure"` //which procedure this belongs to
  14. //below is managed by procedure only
  15. //real state information
  16. Name string `json:"Name"` //state name
  17. CreateAt int32 `json:"CreateAt"` //unix timestamp , when its created
  18. Expire int32 `json:"Expire"` //unix timestamp when this state expire
  19. //persistant sate
  20. Data map[string]string `json:"Data"` //the state save some data for later usage
  21. //runtime memory only
  22. //response string //被动回复消息的内容
  23. }
  24. func createEmptyState(openID, procedure string, expireInSeconds int32) chatState {
  25. r := chatState{}
  26. r.Name = ""
  27. r.OpenID = openID
  28. r.Procedure = procedure
  29. r.CreateAt = int32(time.Now().Unix())
  30. r.Expire = r.CreateAt + expireInSeconds
  31. r.Data = map[string]string{}
  32. return r
  33. }
  34. func (m *chatState) Load(openID, procedure string) (result chatState, err error) {
  35. result, err = getCurrentState(openID, procedure)
  36. *m = result
  37. return
  38. }
  39. //for individual state
  40. func getCurrentState(openID string, procedure string) (result chatState, err error) {
  41. path := getProcedurePath(openID, procedure)
  42. body, err := ioutil.ReadFile(path)
  43. if err != nil { //read file error
  44. if isFileExist(path) {
  45. log.Println("Error session reading " + path)
  46. }
  47. return //empty and expired session
  48. }
  49. err = json.Unmarshal(body, &result)
  50. if err != nil {
  51. log.Printf("Session Content [path=%s] not correct: ", path)
  52. log.Println(err)
  53. }
  54. result.OpenID = openID
  55. result.Procedure = procedure
  56. return
  57. }
  58. func (m *chatState) Save() (err error) {
  59. if m.isEndingState() {
  60. return m.Delete()
  61. }
  62. //save to disk
  63. j, err := json.Marshal(*m)
  64. if err != nil {
  65. return
  66. }
  67. path := getProcedurePath(m.OpenID, m.Procedure)
  68. err = ioutil.WriteFile(path, j, 0600)
  69. if err != nil {
  70. log.Println("write state error" + path)
  71. log.Println(err)
  72. return
  73. }
  74. return
  75. }
  76. func (m *chatState) Delete() (err error) {
  77. path := getProcedurePath(m.OpenID, m.Procedure)
  78. if isFileExist(path) {
  79. err = os.Remove(path)
  80. }
  81. return
  82. }
  83. func (m *chatState) isEndingState() bool {
  84. if isExpired(m.Expire) || m.Name == "" {
  85. return true
  86. }
  87. return false
  88. }