account.go 4.2 KB

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