mem.go 873 B

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647
  1. package ipblack
  2. import (
  3. "sync"
  4. "time"
  5. )
  6. var ipBlackMap = &sync.Map{}
  7. func memSetIPBlack(ip string, duration time.Duration) {
  8. newExpiry := time.Now().Add(duration)
  9. newExpiryPtr := &newExpiry
  10. v, loaded := ipBlackMap.LoadOrStore(ip, newExpiryPtr)
  11. if loaded {
  12. expiredAtPtr, ok := v.(*time.Time)
  13. if !ok {
  14. // Type assertion failed, replace with new value
  15. ipBlackMap.Store(ip, newExpiryPtr)
  16. return
  17. }
  18. // If current value is expired, replace it with new value
  19. if time.Now().After(*expiredAtPtr) {
  20. ipBlackMap.CompareAndSwap(ip, expiredAtPtr, newExpiryPtr)
  21. }
  22. }
  23. }
  24. func memGetIPIsBlock(ip string) bool {
  25. v, ok := ipBlackMap.Load(ip)
  26. if !ok {
  27. return false
  28. }
  29. expiredAtPtr, ok := v.(*time.Time)
  30. if !ok {
  31. return false
  32. }
  33. if time.Now().After(*expiredAtPtr) {
  34. ipBlackMap.CompareAndDelete(ip, expiredAtPtr)
  35. return false
  36. }
  37. return true
  38. }