main.go 9.1 KB

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