main.go 8.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196
  1. package main
  2. import (
  3. "fmt"
  4. "log/slog"
  5. "net"
  6. "os"
  7. "sync"
  8. "github.com/mk6i/retro-aim-server/config"
  9. "github.com/mk6i/retro-aim-server/foodgroup"
  10. "github.com/mk6i/retro-aim-server/server/http"
  11. "github.com/mk6i/retro-aim-server/server/oscar"
  12. "github.com/mk6i/retro-aim-server/server/oscar/handler"
  13. "github.com/mk6i/retro-aim-server/server/oscar/middleware"
  14. "github.com/mk6i/retro-aim-server/state"
  15. "github.com/kelseyhightower/envconfig"
  16. )
  17. func main() {
  18. var cfg config.Config
  19. err := envconfig.Process("", &cfg)
  20. if err != nil {
  21. _, _ = fmt.Fprintf(os.Stderr, "unable to process app config: %s\n", err.Error())
  22. os.Exit(1)
  23. }
  24. feedbagStore, err := state.NewSQLiteUserStore(cfg.DBPath)
  25. if err != nil {
  26. _, _ = fmt.Fprintf(os.Stderr, "unable to create feedbag store: %s\n", err.Error())
  27. os.Exit(1)
  28. }
  29. cookieBaker, err := state.NewHMACCookieBaker()
  30. if err != nil {
  31. _, _ = fmt.Fprintf(os.Stderr, "unable to create HMAC cookie baker: %s\n", err.Error())
  32. os.Exit(1)
  33. }
  34. logger := middleware.NewLogger(cfg)
  35. sessionManager := state.NewInMemorySessionManager(logger)
  36. chatSessionManager := state.NewInMemoryChatSessionManager(logger)
  37. adjListBuddyListStore := state.NewAdjListBuddyListStore()
  38. wg := sync.WaitGroup{}
  39. wg.Add(7)
  40. go func() {
  41. http.StartManagementAPI(cfg, feedbagStore, sessionManager, feedbagStore, feedbagStore, chatSessionManager, sessionManager, logger)
  42. wg.Done()
  43. }()
  44. go func(logger *slog.Logger) {
  45. logger = logger.With("svc", "BOS")
  46. authService := foodgroup.NewAuthService(cfg, sessionManager, chatSessionManager, feedbagStore, adjListBuddyListStore, cookieBaker, sessionManager, feedbagStore, chatSessionManager, feedbagStore)
  47. bartService := foodgroup.NewBARTService(logger, feedbagStore, sessionManager, feedbagStore, adjListBuddyListStore)
  48. buddyService := foodgroup.NewBuddyService(sessionManager, feedbagStore, adjListBuddyListStore)
  49. chatNavService := foodgroup.NewChatNavService(logger, feedbagStore, state.NewChatRoom)
  50. feedbagService := foodgroup.NewFeedbagService(logger, sessionManager, feedbagStore, feedbagStore, adjListBuddyListStore)
  51. foodgroupService := foodgroup.NewPermitDenyService()
  52. icbmService := foodgroup.NewICBMService(sessionManager, feedbagStore, adjListBuddyListStore)
  53. locateService := foodgroup.NewLocateService(sessionManager, feedbagStore, feedbagStore, adjListBuddyListStore)
  54. oServiceService := foodgroup.NewOServiceServiceForBOS(cfg, sessionManager, adjListBuddyListStore, logger, cookieBaker, feedbagStore, feedbagStore)
  55. oscar.BOSServer{
  56. AuthService: authService,
  57. Config: cfg,
  58. Handler: handler.NewBOSRouter(handler.Handlers{
  59. AlertHandler: handler.NewAlertHandler(logger),
  60. BARTHandler: handler.NewBARTHandler(logger, bartService),
  61. BuddyHandler: handler.NewBuddyHandler(logger, buddyService),
  62. ChatNavHandler: handler.NewChatNavHandler(chatNavService, logger),
  63. FeedbagHandler: handler.NewFeedbagHandler(logger, feedbagService),
  64. ICBMHandler: handler.NewICBMHandler(logger, icbmService),
  65. LocateHandler: handler.NewLocateHandler(locateService, logger),
  66. OServiceHandler: handler.NewOServiceHandler(logger, oServiceService),
  67. PermitDenyHandler: handler.NewPermitDenyHandler(logger, foodgroupService),
  68. }),
  69. Logger: logger,
  70. OnlineNotifier: oServiceService,
  71. ListenAddr: net.JoinHostPort("", cfg.BOSPort),
  72. }.Start()
  73. wg.Done()
  74. }(logger)
  75. go func(logger *slog.Logger) {
  76. logger = logger.With("svc", "CHAT")
  77. sessionManager := state.NewInMemorySessionManager(logger)
  78. authService := foodgroup.NewAuthService(cfg, sessionManager, chatSessionManager, feedbagStore, adjListBuddyListStore, cookieBaker, sessionManager, feedbagStore, chatSessionManager, feedbagStore)
  79. chatService := foodgroup.NewChatService(chatSessionManager)
  80. oServiceService := foodgroup.NewOServiceServiceForChat(cfg, logger, sessionManager, adjListBuddyListStore, feedbagStore, feedbagStore, chatSessionManager)
  81. oscar.ChatServer{
  82. AuthService: authService,
  83. Config: cfg,
  84. Handler: handler.NewChatRouter(handler.Handlers{
  85. ChatHandler: handler.NewChatHandler(logger, chatService),
  86. OServiceHandler: handler.NewOServiceHandler(logger, oServiceService),
  87. }),
  88. Logger: logger,
  89. OnlineNotifier: oServiceService,
  90. }.Start()
  91. wg.Done()
  92. }(logger)
  93. go func(logger *slog.Logger) {
  94. logger = logger.With("svc", "CHAT_NAV")
  95. sessionManager := state.NewInMemorySessionManager(logger)
  96. authService := foodgroup.NewAuthService(cfg, sessionManager, chatSessionManager, feedbagStore, adjListBuddyListStore, cookieBaker, sessionManager, feedbagStore, chatSessionManager, feedbagStore)
  97. chatNavService := foodgroup.NewChatNavService(logger, feedbagStore, state.NewChatRoom)
  98. oServiceService := foodgroup.NewOServiceServiceForChatNav(cfg, logger, sessionManager, adjListBuddyListStore, feedbagStore)
  99. oscar.BOSServer{
  100. AuthService: authService,
  101. Config: cfg,
  102. Handler: handler.NewChatNavRouter(handler.Handlers{
  103. ChatNavHandler: handler.NewChatNavHandler(chatNavService, logger),
  104. OServiceHandler: handler.NewOServiceHandler(logger, oServiceService),
  105. }),
  106. Logger: logger,
  107. OnlineNotifier: oServiceService,
  108. ListenAddr: net.JoinHostPort("", cfg.ChatNavPort),
  109. }.Start()
  110. wg.Done()
  111. }(logger)
  112. go func(logger *slog.Logger) {
  113. logger = logger.With("svc", "ALERT")
  114. sessionManager := state.NewInMemorySessionManager(logger)
  115. authService := foodgroup.NewAuthService(cfg, sessionManager, chatSessionManager, feedbagStore, adjListBuddyListStore, cookieBaker, sessionManager, feedbagStore, chatSessionManager, feedbagStore)
  116. oServiceService := foodgroup.NewOServiceServiceForAlert(cfg, logger, sessionManager, adjListBuddyListStore, feedbagStore)
  117. oscar.BOSServer{
  118. AuthService: authService,
  119. Config: cfg,
  120. Handler: handler.NewAlertRouter(handler.Handlers{
  121. AlertHandler: handler.NewAlertHandler(logger),
  122. OServiceHandler: handler.NewOServiceHandler(logger, oServiceService),
  123. }),
  124. Logger: logger,
  125. OnlineNotifier: oServiceService,
  126. ListenAddr: net.JoinHostPort("", cfg.AlertPort),
  127. }.Start()
  128. wg.Done()
  129. }(logger)
  130. go func(logger *slog.Logger) {
  131. logger = logger.With("svc", "ADMIN")
  132. buddyService := foodgroup.NewBuddyService(sessionManager, feedbagStore, adjListBuddyListStore)
  133. adminService := foodgroup.NewAdminService(sessionManager, feedbagStore, buddyService, sessionManager)
  134. authService := foodgroup.NewAuthService(cfg, sessionManager, chatSessionManager, feedbagStore, adjListBuddyListStore, cookieBaker, sessionManager, feedbagStore, chatSessionManager, feedbagStore)
  135. oServiceService := foodgroup.NewOServiceServiceForAdmin(cfg, logger, buddyService)
  136. oscar.AdminServer{
  137. AuthService: authService,
  138. Config: cfg,
  139. Handler: handler.NewAdminRouter(handler.Handlers{
  140. AdminHandler: handler.NewAdminHandler(logger, adminService),
  141. OServiceHandler: handler.NewOServiceHandler(logger, oServiceService),
  142. }),
  143. Logger: logger,
  144. OnlineNotifier: oServiceService,
  145. ListenAddr: net.JoinHostPort("", cfg.AdminPort),
  146. }.Start()
  147. wg.Done()
  148. }(logger)
  149. go func(logger *slog.Logger) {
  150. logger = logger.With("svc", "BART")
  151. sessionManager := state.NewInMemorySessionManager(logger)
  152. bartService := foodgroup.NewBARTService(logger, feedbagStore, sessionManager, feedbagStore, adjListBuddyListStore)
  153. authService := foodgroup.NewAuthService(cfg, sessionManager, chatSessionManager, feedbagStore, adjListBuddyListStore, cookieBaker, sessionManager, feedbagStore, chatSessionManager, feedbagStore)
  154. oServiceService := foodgroup.NewOServiceServiceForBART(cfg, logger, sessionManager, adjListBuddyListStore, feedbagStore)
  155. oscar.BOSServer{
  156. AuthService: authService,
  157. Config: cfg,
  158. Handler: handler.NewBARTRouter(handler.Handlers{
  159. BARTHandler: handler.NewBARTHandler(logger, bartService),
  160. OServiceHandler: handler.NewOServiceHandler(logger, oServiceService),
  161. }),
  162. ListenAddr: net.JoinHostPort("", cfg.BARTPort),
  163. Logger: logger,
  164. OnlineNotifier: oServiceService,
  165. }.Start()
  166. wg.Done()
  167. }(logger)
  168. go func(logger *slog.Logger) {
  169. logger = logger.With("svc", "AUTH")
  170. authHandler := foodgroup.NewAuthService(cfg, sessionManager, chatSessionManager, feedbagStore, adjListBuddyListStore, cookieBaker, nil, nil, chatSessionManager, feedbagStore)
  171. oscar.AuthServer{
  172. AuthService: authHandler,
  173. Config: cfg,
  174. Logger: logger,
  175. }.Start()
  176. wg.Done()
  177. }(logger)
  178. wg.Wait()
  179. }