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.

utils.go 1.7KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687
  1. // Copyright (c) 2020 Shivaram Lingamneni
  2. // released under the MIT license
  3. package sno
  4. import (
  5. "strings"
  6. )
  7. func IsValidMask(r rune) bool {
  8. for _, m := range ValidMasks {
  9. if m == Mask(r) {
  10. return true
  11. }
  12. }
  13. return false
  14. }
  15. func (masks Masks) String() string {
  16. var buf strings.Builder
  17. buf.Grow(len(masks))
  18. for _, m := range masks {
  19. buf.WriteRune(rune(m))
  20. }
  21. return buf.String()
  22. }
  23. func (masks Masks) Contains(mask Mask) bool {
  24. for _, m := range masks {
  25. if mask == m {
  26. return true
  27. }
  28. }
  29. return false
  30. }
  31. // Evaluate changes to snomasks made with MODE. There are several cases:
  32. // adding snomasks with `/mode +s a` or `/mode +s +a`, removing them with `/mode +s -a`,
  33. // adding all with `/mode +s *` or `/mode +s +*`, removing all with `/mode +s -*` or `/mode -s`
  34. func EvaluateSnomaskChanges(add bool, arg string, currentMasks Masks) (addMasks, removeMasks Masks, newArg string) {
  35. if add {
  36. if len(arg) == 0 {
  37. return
  38. }
  39. add := true
  40. switch arg[0] {
  41. case '+':
  42. arg = arg[1:]
  43. case '-':
  44. add = false
  45. arg = arg[1:]
  46. default:
  47. // add
  48. }
  49. if strings.IndexByte(arg, '*') != -1 {
  50. if add {
  51. for _, mask := range ValidMasks {
  52. if !currentMasks.Contains(mask) {
  53. addMasks = append(addMasks, mask)
  54. }
  55. }
  56. } else {
  57. removeMasks = currentMasks
  58. }
  59. } else {
  60. for _, r := range arg {
  61. if IsValidMask(r) {
  62. m := Mask(r)
  63. if add && !currentMasks.Contains(m) {
  64. addMasks = append(addMasks, m)
  65. } else if !add && currentMasks.Contains(m) {
  66. removeMasks = append(removeMasks, m)
  67. }
  68. }
  69. }
  70. }
  71. if len(addMasks) != 0 {
  72. newArg = "+" + addMasks.String()
  73. } else if len(removeMasks) != 0 {
  74. newArg = "-" + removeMasks.String()
  75. }
  76. } else {
  77. removeMasks = currentMasks
  78. newArg = ""
  79. }
  80. return
  81. }