package tv.dyndns.kishibe.qmaclone.server; import com.google.common.annotations.VisibleForTesting; import com.google.common.base.Strings; import com.google.common.collect.ConcurrentHashMultiset; import com.google.common.collect.Multiset; public class ChatPostCounter implements Runnable { @VisibleForTesting static final int LIMIT_PER_MINUTE = 10; @VisibleForTesting static final String LOCAL_HOST = "127.0.0.1"; private final Multiset<Integer> userCodes = ConcurrentHashMultiset.create(); private final Multiset<String> remoteAddresses = ConcurrentHashMultiset.create(); @Override public void run() { userCodes.clear(); remoteAddresses.clear(); } public boolean isAbleToPost(int userCode, String remoteAddress) { return userCodes.count(userCode) <= LIMIT_PER_MINUTE && (Strings.isNullOrEmpty(remoteAddress) || remoteAddress.equals(LOCAL_HOST) || remoteAddresses .count(remoteAddress) <= LIMIT_PER_MINUTE); } public void add(int userCode, String remoteAddress) { userCodes.add(userCode); if (!Strings.isNullOrEmpty(remoteAddress) && !remoteAddress.equals(LOCAL_HOST)) { remoteAddresses.add(remoteAddress); } } }