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.

accept.go 1.9KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576
  1. package irc
  2. import (
  3. "sync"
  4. "github.com/ergochat/ergo/irc/utils"
  5. )
  6. // tracks ACCEPT relationships, i.e., `accepter` is willing to receive DMs from
  7. // `accepted` despite some restriction (currently the only relevant restriction
  8. // is that `accepter` is +R and `accepted` is not logged in)
  9. type AcceptManager struct {
  10. sync.RWMutex
  11. // maps recipient -> whitelist of permitted senders:
  12. // this is what we actually check
  13. clientToAccepted map[*Client]utils.HashSet[*Client]
  14. // this is the reverse mapping, it's needed so we can
  15. // clean up the forward mapping during (*Client).destroy():
  16. clientToAccepters map[*Client]utils.HashSet[*Client]
  17. }
  18. func (am *AcceptManager) Initialize() {
  19. am.clientToAccepted = make(map[*Client]utils.HashSet[*Client])
  20. am.clientToAccepters = make(map[*Client]utils.HashSet[*Client])
  21. }
  22. func (am *AcceptManager) MaySendTo(sender, recipient *Client) (result bool) {
  23. am.RLock()
  24. defer am.RUnlock()
  25. return am.clientToAccepted[recipient].Has(sender)
  26. }
  27. func (am *AcceptManager) Accept(accepter, accepted *Client) {
  28. am.Lock()
  29. defer am.Unlock()
  30. var m utils.HashSet[*Client]
  31. m = am.clientToAccepted[accepter]
  32. if m == nil {
  33. m = make(utils.HashSet[*Client])
  34. am.clientToAccepted[accepter] = m
  35. }
  36. m.Add(accepted)
  37. m = am.clientToAccepters[accepted]
  38. if m == nil {
  39. m = make(utils.HashSet[*Client])
  40. am.clientToAccepters[accepted] = m
  41. }
  42. m.Add(accepter)
  43. }
  44. func (am *AcceptManager) Unaccept(accepter, accepted *Client) {
  45. am.Lock()
  46. defer am.Unlock()
  47. delete(am.clientToAccepted[accepter], accepted)
  48. delete(am.clientToAccepters[accepted], accepter)
  49. }
  50. func (am *AcceptManager) Remove(client *Client) {
  51. am.Lock()
  52. defer am.Unlock()
  53. for accepter := range am.clientToAccepters[client] {
  54. delete(am.clientToAccepted[accepter], client)
  55. }
  56. for accepted := range am.clientToAccepted[client] {
  57. delete(am.clientToAccepters[accepted], client)
  58. }
  59. delete(am.clientToAccepters, client)
  60. delete(am.clientToAccepted, client)
  61. }