account.go 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154
  1. package world
  2. import "path/filepath"
  3. import "os"
  4. import "encoding/xml"
  5. import "github.com/beoran/woe/sitef"
  6. import "github.com/beoran/woe/monolog"
  7. import "fmt"
  8. import "errors"
  9. import "strconv"
  10. type Named struct {
  11. Name string
  12. }
  13. type Account struct {
  14. Name string
  15. Hash string
  16. Algo string
  17. Email string
  18. Points int
  19. CharacterNames []string
  20. characters [] * Character
  21. }
  22. func SavePathForXML(dirname string, typename string, name string) string {
  23. return filepath.Join(dirname, typename, name + ".xml")
  24. }
  25. func SavePathFor(dirname string, typename string, name string) string {
  26. return filepath.Join(dirname, typename, name + ".sitef")
  27. }
  28. func NewAccount(name string, pass string, email string, points int) (*Account) {
  29. return &Account{name, pass, "plain", email, points, nil, nil}
  30. }
  31. // Password Challenge for an account.
  32. func (me * Account) Challenge(challenge string) bool {
  33. if me.Algo == "plain" {
  34. return me.Hash == challenge
  35. }
  36. // XXX implement encryption later
  37. return false
  38. }
  39. // Helpers for use with sitef records
  40. func SitefStoreString(rec sitef.Record, key string, val string) {
  41. rec[key] = val
  42. }
  43. func SitefStoreInt(rec sitef.Record, key string, val int) {
  44. rec[key] = fmt.Sprintf("%d", val)
  45. }
  46. func SitefStoreArray(rec sitef.Record, key string, val LabeledList) {
  47. }
  48. // Save an account as a sitef file.
  49. func (me * Account) Save(dirname string) (err error) {
  50. path := SavePathFor(dirname, "account", me.Name)
  51. rec := make(sitef.Record)
  52. rec["name"] = me.Name
  53. rec["hash"] = me.Hash
  54. rec["algo"] = me.Algo
  55. rec["email"] = me.Email
  56. rec["points"] = fmt.Sprintf("%d", me.Points)
  57. rec["characters"] = fmt.Sprintf("%d", len(me.characters))
  58. for i, chara := range me.characters {
  59. key := fmt.Sprintf("characters[%d]", i)
  60. rec[key] = chara.Name
  61. }
  62. monolog.Debug("Saving Acccount record: %s %v", path, rec)
  63. return sitef.SaveRecord(path, rec)
  64. }
  65. // Load an account from a sitef file.
  66. func LoadAccount(dirname string, name string) (account *Account, err error) {
  67. path := SavePathFor(dirname, "account", name)
  68. records, err := sitef.ParseFilename(path)
  69. if err != nil {
  70. return nil, err
  71. }
  72. if len(records) < 1 {
  73. return nil, errors.New("No record found!")
  74. }
  75. record := records[0]
  76. monolog.Info("Loading Account record: %s %v", path, record)
  77. account = new(Account)
  78. account.Name = record["name"]
  79. account.Hash = record["hash"]
  80. account.Algo = record["algo"]
  81. account.Email = record["email"]
  82. account.Points, err = strconv.Atoi(record["points"])
  83. if err != nil {
  84. account.Points = 0
  85. }
  86. var nchars int
  87. nchars, err = strconv.Atoi(record["characters"])
  88. if err != nil {
  89. nchars = 0
  90. }
  91. _ = nchars
  92. /* Todo: load characters here... */
  93. monolog.Info("Loaded Account: %s %v", path, record)
  94. return account, nil
  95. }
  96. func (me * Account) SaveXML(dirname string) (err error) {
  97. path := SavePathForXML(dirname, "account", me.Name)
  98. file, err := os.Create(path)
  99. if err != nil {
  100. return err
  101. }
  102. enc := xml.NewEncoder(file)
  103. enc.Indent(" ", " ")
  104. return enc.Encode(me)
  105. }
  106. func LoadAccountXML(dirname string, name string) (account *Account, err error) {
  107. path := SavePathForXML(dirname, "account", name)
  108. file, err := os.Open(path)
  109. if err != nil {
  110. return nil, err
  111. }
  112. dec := xml.NewDecoder(file)
  113. account = new(Account)
  114. err = dec.Decode(account)
  115. return account, nil
  116. }