You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

getters.go 8.5KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354
  1. // Copyright (c) 2017 Shivaram Lingamneni <slingamn@cs.stanford.edu>
  2. // released under the MIT license
  3. package irc
  4. import (
  5. "time"
  6. "github.com/oragono/oragono/irc/isupport"
  7. "github.com/oragono/oragono/irc/languages"
  8. "github.com/oragono/oragono/irc/modes"
  9. )
  10. func (server *Server) Config() (config *Config) {
  11. server.configurableStateMutex.RLock()
  12. config = server.config
  13. server.configurableStateMutex.RUnlock()
  14. return
  15. }
  16. func (server *Server) ISupport() *isupport.List {
  17. server.configurableStateMutex.RLock()
  18. defer server.configurableStateMutex.RUnlock()
  19. return server.isupport
  20. }
  21. func (server *Server) Limits() Limits {
  22. return server.Config().Limits
  23. }
  24. func (server *Server) Password() []byte {
  25. return server.Config().Server.passwordBytes
  26. }
  27. func (server *Server) RecoverFromErrors() bool {
  28. return *server.Config().Debug.RecoverFromErrors
  29. }
  30. func (server *Server) DefaultChannelModes() modes.Modes {
  31. return server.Config().Channels.defaultModes
  32. }
  33. func (server *Server) ChannelRegistrationEnabled() bool {
  34. return server.Config().Channels.Registration.Enabled
  35. }
  36. func (server *Server) AccountConfig() *AccountConfig {
  37. return &server.Config().Accounts
  38. }
  39. func (server *Server) GetOperator(name string) (oper *Oper) {
  40. name, err := CasefoldName(name)
  41. if err != nil {
  42. return
  43. }
  44. server.configurableStateMutex.RLock()
  45. defer server.configurableStateMutex.RUnlock()
  46. return server.config.operators[name]
  47. }
  48. func (server *Server) Languages() (lm *languages.Manager) {
  49. return server.Config().languageManager
  50. }
  51. func (client *Client) Sessions() (sessions []*Session) {
  52. client.stateMutex.RLock()
  53. sessions = make([]*Session, len(client.sessions))
  54. copy(sessions, client.sessions)
  55. client.stateMutex.RUnlock()
  56. return
  57. }
  58. func (client *Client) AddSession(session *Session) (success bool) {
  59. client.stateMutex.Lock()
  60. defer client.stateMutex.Unlock()
  61. if len(client.sessions) == 0 {
  62. return false
  63. }
  64. session.client = client
  65. client.sessions = append(client.sessions, session)
  66. return true
  67. }
  68. func (client *Client) removeSession(session *Session) (success bool, length int) {
  69. if len(client.sessions) == 0 {
  70. return
  71. }
  72. sessions := make([]*Session, 0, len(client.sessions)-1)
  73. for _, currentSession := range client.sessions {
  74. if session == currentSession {
  75. success = true
  76. } else {
  77. sessions = append(sessions, currentSession)
  78. }
  79. }
  80. client.sessions = sessions
  81. length = len(sessions)
  82. return
  83. }
  84. func (client *Client) Nick() string {
  85. client.stateMutex.RLock()
  86. defer client.stateMutex.RUnlock()
  87. return client.nick
  88. }
  89. func (client *Client) NickMaskString() string {
  90. client.stateMutex.RLock()
  91. defer client.stateMutex.RUnlock()
  92. return client.nickMaskString
  93. }
  94. func (client *Client) NickCasefolded() string {
  95. client.stateMutex.RLock()
  96. defer client.stateMutex.RUnlock()
  97. return client.nickCasefolded
  98. }
  99. func (client *Client) NickMaskCasefolded() string {
  100. client.stateMutex.RLock()
  101. defer client.stateMutex.RUnlock()
  102. return client.nickMaskCasefolded
  103. }
  104. func (client *Client) Username() string {
  105. client.stateMutex.RLock()
  106. defer client.stateMutex.RUnlock()
  107. return client.username
  108. }
  109. func (client *Client) Hostname() string {
  110. client.stateMutex.RLock()
  111. defer client.stateMutex.RUnlock()
  112. return client.hostname
  113. }
  114. func (client *Client) Realname() string {
  115. client.stateMutex.RLock()
  116. defer client.stateMutex.RUnlock()
  117. return client.realname
  118. }
  119. // uniqueIdentifiers returns the strings for which the server enforces per-client
  120. // uniqueness/ownership; no two clients can have colliding casefolded nicks or
  121. // skeletons.
  122. func (client *Client) uniqueIdentifiers() (nickCasefolded string, skeleton string) {
  123. client.stateMutex.RLock()
  124. defer client.stateMutex.RUnlock()
  125. return client.nickCasefolded, client.skeleton
  126. }
  127. func (client *Client) ResumeID() string {
  128. client.stateMutex.RLock()
  129. defer client.stateMutex.RUnlock()
  130. return client.resumeID
  131. }
  132. func (client *Client) SetResumeID(id string) {
  133. client.stateMutex.Lock()
  134. defer client.stateMutex.Unlock()
  135. client.resumeID = id
  136. }
  137. func (client *Client) Oper() *Oper {
  138. client.stateMutex.RLock()
  139. defer client.stateMutex.RUnlock()
  140. return client.oper
  141. }
  142. func (client *Client) Registered() bool {
  143. client.stateMutex.RLock()
  144. defer client.stateMutex.RUnlock()
  145. return client.registered
  146. }
  147. func (client *Client) SetRegistered() {
  148. // `registered` is only written from the client's own goroutine, but may be
  149. // read from other goroutines; therefore, the client's own goroutine may read
  150. // the value without synchronization, but must write it with synchronization,
  151. // and other goroutines must read it with synchronization
  152. client.stateMutex.Lock()
  153. client.registered = true
  154. client.stateMutex.Unlock()
  155. }
  156. func (client *Client) RawHostname() (result string) {
  157. client.stateMutex.Lock()
  158. result = client.rawHostname
  159. client.stateMutex.Unlock()
  160. return
  161. }
  162. func (client *Client) AwayMessage() (result string) {
  163. client.stateMutex.RLock()
  164. result = client.awayMessage
  165. client.stateMutex.RUnlock()
  166. return
  167. }
  168. func (client *Client) SetAwayMessage(message string) {
  169. client.stateMutex.Lock()
  170. client.awayMessage = message
  171. client.stateMutex.Unlock()
  172. }
  173. func (client *Client) Account() string {
  174. client.stateMutex.RLock()
  175. defer client.stateMutex.RUnlock()
  176. return client.account
  177. }
  178. func (client *Client) AccountName() string {
  179. client.stateMutex.RLock()
  180. defer client.stateMutex.RUnlock()
  181. return client.accountName
  182. }
  183. func (client *Client) SetAccountName(account string) (changed bool) {
  184. var casefoldedAccount string
  185. var err error
  186. if account != "" {
  187. if casefoldedAccount, err = CasefoldName(account); err != nil {
  188. return
  189. }
  190. }
  191. client.stateMutex.Lock()
  192. defer client.stateMutex.Unlock()
  193. changed = client.account != casefoldedAccount
  194. client.account = casefoldedAccount
  195. client.accountName = account
  196. return
  197. }
  198. func (client *Client) Languages() (languages []string) {
  199. client.stateMutex.RLock()
  200. languages = client.languages
  201. client.stateMutex.RUnlock()
  202. return languages
  203. }
  204. func (client *Client) SetLanguages(languages []string) {
  205. client.stateMutex.Lock()
  206. client.languages = languages
  207. client.stateMutex.Unlock()
  208. }
  209. func (client *Client) HasMode(mode modes.Mode) bool {
  210. // client.flags has its own synch
  211. return client.flags.HasMode(mode)
  212. }
  213. func (client *Client) SetMode(mode modes.Mode, on bool) bool {
  214. return client.flags.SetMode(mode, on)
  215. }
  216. func (client *Client) Channels() (result []*Channel) {
  217. client.stateMutex.RLock()
  218. defer client.stateMutex.RUnlock()
  219. length := len(client.channels)
  220. result = make([]*Channel, length)
  221. i := 0
  222. for channel := range client.channels {
  223. result[i] = channel
  224. i++
  225. }
  226. return
  227. }
  228. func (client *Client) NumChannels() int {
  229. client.stateMutex.RLock()
  230. defer client.stateMutex.RUnlock()
  231. return len(client.channels)
  232. }
  233. func (client *Client) WhoWas() (result WhoWas) {
  234. return client.Details().WhoWas
  235. }
  236. func (client *Client) Details() (result ClientDetails) {
  237. client.stateMutex.RLock()
  238. defer client.stateMutex.RUnlock()
  239. result.nick = client.nick
  240. result.nickCasefolded = client.nickCasefolded
  241. result.username = client.username
  242. result.hostname = client.hostname
  243. result.realname = client.realname
  244. result.nickMask = client.nickMaskString
  245. result.nickMaskCasefolded = client.nickMaskCasefolded
  246. result.account = client.account
  247. result.accountName = client.accountName
  248. return
  249. }
  250. func (channel *Channel) Name() string {
  251. channel.stateMutex.RLock()
  252. defer channel.stateMutex.RUnlock()
  253. return channel.name
  254. }
  255. func (channel *Channel) NameCasefolded() string {
  256. channel.stateMutex.RLock()
  257. defer channel.stateMutex.RUnlock()
  258. return channel.nameCasefolded
  259. }
  260. func (channel *Channel) Rename(name, nameCasefolded string) {
  261. channel.stateMutex.Lock()
  262. channel.name = name
  263. channel.nameCasefolded = nameCasefolded
  264. if channel.registeredFounder != "" {
  265. channel.registeredTime = time.Now()
  266. }
  267. channel.stateMutex.Unlock()
  268. }
  269. func (channel *Channel) Members() (result []*Client) {
  270. channel.stateMutex.RLock()
  271. defer channel.stateMutex.RUnlock()
  272. return channel.membersCache
  273. }
  274. func (channel *Channel) setUserLimit(limit int) {
  275. channel.stateMutex.Lock()
  276. channel.userLimit = limit
  277. channel.stateMutex.Unlock()
  278. }
  279. func (channel *Channel) Key() string {
  280. channel.stateMutex.RLock()
  281. defer channel.stateMutex.RUnlock()
  282. return channel.key
  283. }
  284. func (channel *Channel) setKey(key string) {
  285. channel.stateMutex.Lock()
  286. defer channel.stateMutex.Unlock()
  287. channel.key = key
  288. }
  289. func (channel *Channel) Founder() string {
  290. channel.stateMutex.RLock()
  291. defer channel.stateMutex.RUnlock()
  292. return channel.registeredFounder
  293. }
  294. func (channel *Channel) DirtyBits() (dirtyBits uint) {
  295. channel.stateMutex.Lock()
  296. dirtyBits = channel.dirtyBits
  297. channel.stateMutex.Unlock()
  298. return
  299. }