diff --git a/gemp-lotr/gemp-lotr-async/src/main/web/js/gemp-022/PC_Cards.js b/gemp-lotr/gemp-lotr-async/src/main/web/js/gemp-022/PC_Cards.js index 52ccc171d..95e10552c 100644 --- a/gemp-lotr/gemp-lotr-async/src/main/web/js/gemp-022/PC_Cards.js +++ b/gemp-lotr/gemp-lotr-async/src/main/web/js/gemp-022/PC_Cards.js @@ -154,5 +154,14 @@ var PCCards = { //August 2021 '1_366': 'https://i.lotrtcgpc.net/promos/2021/08/PCPROMO_FA_01298.jpg', '1_367': 'https://i.lotrtcgpc.net/promos/2021/08/PCPROMO_FA_01349.jpg', + //September 2021 + '9_53': 'https://i.lotrtcgpc.net/promos/2021/09/PCPROMO_FA_09033.jpg', + '10_123':'https://i.lotrtcgpc.net/promos/2021/09/PCPROMO_FA_10123.jpg', + //October 2021 + '1_368':'https://i.lotrtcgpc.net/promos/2021/10/PCPROMO_FA_01083.jpg', + '1_369':'https://i.lotrtcgpc.net/promos/2021/10/PCPROMO_FA_01127.jpg', + //November 2021 + '8_123':'https://i.lotrtcgpc.net/promos/2021/11/PCPROMO_FA_08102.jpg', + '9_54':'https://i.lotrtcgpc.net/promos/2021/11/PCPROMO_FA_09014.jpg', } diff --git a/gemp-lotr/gemp-lotr-cards/src/main/resources/blueprintMapping.txt b/gemp-lotr/gemp-lotr-cards/src/main/resources/blueprintMapping.txt index 802b34ddb..1790bae1d 100644 --- a/gemp-lotr/gemp-lotr-cards/src/main/resources/blueprintMapping.txt +++ b/gemp-lotr/gemp-lotr-cards/src/main/resources/blueprintMapping.txt @@ -233,7 +233,19 @@ gl_theOneRing,1_2 11_267,11_54 #The Witch-king, Captain of the Nine Riders 11_268,11_226 -#Hobbit Stealth +#Hobbit Stealth - 2021/08 1_366,1_298 -#Bridge of Khazad-dum +#Bridge of Khazad-dum - 2021/08 1_367,1_349 +#Isildur, Bearer of Heirlooms - 2021/09 +9_53,9_33 +#Shelob, Her Ladyship - 2021/09 +10_123,10_23 +#Servant of the Secret Flame - 2021/10 +1_368,1_83 +#Lurtz, Servant of Isengard - 2021/10 +1_369,1_127 +#Galadriel, Bearer of Wisdom - 2021/11 +9_54,9_14 +#Great Hill Troll - 2021/11 +8_123,8_102 diff --git a/gemp-lotr/gemp-lotr-server/src/main/java/com/gempukku/lotro/builder/ServerBuilder.java b/gemp-lotr/gemp-lotr-server/src/main/java/com/gempukku/lotro/builder/ServerBuilder.java index 662d05c7a..5b1afe661 100644 --- a/gemp-lotr/gemp-lotr-server/src/main/java/com/gempukku/lotro/builder/ServerBuilder.java +++ b/gemp-lotr/gemp-lotr-server/src/main/java/com/gempukku/lotro/builder/ServerBuilder.java @@ -89,7 +89,8 @@ public class ServerBuilder { extract(objectMap, CardSets.class))); objectMap.put(ChatServer.class, new ChatServer( - extract(objectMap, IgnoreDAO.class))); + extract(objectMap, IgnoreDAO.class), + extract(objectMap, PlayerDAO.class))); objectMap.put(LotroServer.class, new LotroServer( diff --git a/gemp-lotr/gemp-lotr-server/src/main/java/com/gempukku/lotro/chat/ChatRoomMediator.java b/gemp-lotr/gemp-lotr-server/src/main/java/com/gempukku/lotro/chat/ChatRoomMediator.java index 75d697883..d67c81d59 100644 --- a/gemp-lotr/gemp-lotr-server/src/main/java/com/gempukku/lotro/chat/ChatRoomMediator.java +++ b/gemp-lotr/gemp-lotr-server/src/main/java/com/gempukku/lotro/chat/ChatRoomMediator.java @@ -3,15 +3,18 @@ package com.gempukku.lotro.chat; import com.gempukku.lotro.PrivateInformationException; import com.gempukku.lotro.SubscriptionExpiredException; import com.gempukku.lotro.db.IgnoreDAO; +import com.gempukku.lotro.db.PlayerDAO; import com.gempukku.lotro.game.ChatCommunicationChannel; import org.apache.log4j.Logger; +import java.sql.SQLException; import java.util.*; import java.util.concurrent.locks.ReadWriteLock; import java.util.concurrent.locks.ReentrantReadWriteLock; public class ChatRoomMediator { private IgnoreDAO ignoreDAO; + private PlayerDAO playerDAO; private Logger _logger; private ChatRoom _chatRoom; @@ -25,14 +28,15 @@ public class ChatRoomMediator { private Map _chatCommandCallbacks = new HashMap(); private String welcomeMessage; - public ChatRoomMediator(IgnoreDAO ignoreDAO, String roomName, boolean muteJoinPartMessages, int secondsTimeoutPeriod, boolean allowIncognito, String welcomeMessage) { - this(ignoreDAO, roomName, muteJoinPartMessages, secondsTimeoutPeriod, null, allowIncognito); + public ChatRoomMediator(IgnoreDAO ignoreDAO, PlayerDAO playerDAO, String roomName, boolean muteJoinPartMessages, int secondsTimeoutPeriod, boolean allowIncognito, String welcomeMessage) { + this(ignoreDAO, playerDAO, roomName, muteJoinPartMessages, secondsTimeoutPeriod, null, allowIncognito); this.welcomeMessage = welcomeMessage; } - public ChatRoomMediator(IgnoreDAO ignoreDAO, String roomName, boolean muteJoinPartMessages, int secondsTimeoutPeriod, Set allowedPlayers, + public ChatRoomMediator(IgnoreDAO ignoreDAO, PlayerDAO playerDAO, String roomName, boolean muteJoinPartMessages, int secondsTimeoutPeriod, Set allowedPlayers, boolean allowIncognito) { this.ignoreDAO = ignoreDAO; + this.playerDAO = playerDAO; _logger = Logger.getLogger("chat."+roomName); _allowedPlayers = allowedPlayers; _channelInactivityTimeoutPeriod = 1000 * secondsTimeoutPeriod; @@ -43,13 +47,15 @@ public class ChatRoomMediator { _chatCommandCallbacks.put(command.toLowerCase(), callback); } - public List joinUser(String playerId, boolean admin) throws PrivateInformationException { + public List joinUser(String playerId, boolean admin) throws PrivateInformationException, SQLException { _lock.writeLock().lock(); try { if (!admin && _allowedPlayers != null && !_allowedPlayers.contains(playerId)) throw new PrivateInformationException(); - ChatCommunicationChannel value = new ChatCommunicationChannel(ignoreDAO.getIgnoredUsers(playerId)); + Set usersToIgnore = playerDAO.getBannedUsernames(); + usersToIgnore.addAll(ignoreDAO.getIgnoredUsers(playerId)); + ChatCommunicationChannel value = new ChatCommunicationChannel(usersToIgnore); _listeners.put(playerId, value); _chatRoom.joinChatRoom(playerId, value); final List chatMessages = value.consumeMessages(); diff --git a/gemp-lotr/gemp-lotr-server/src/main/java/com/gempukku/lotro/chat/ChatServer.java b/gemp-lotr/gemp-lotr-server/src/main/java/com/gempukku/lotro/chat/ChatServer.java index 14104ea29..2c7c3f9b1 100644 --- a/gemp-lotr/gemp-lotr-server/src/main/java/com/gempukku/lotro/chat/ChatServer.java +++ b/gemp-lotr/gemp-lotr-server/src/main/java/com/gempukku/lotro/chat/ChatServer.java @@ -3,6 +3,7 @@ package com.gempukku.lotro.chat; import com.gempukku.lotro.AbstractServer; import com.gempukku.lotro.PrivateInformationException; import com.gempukku.lotro.db.IgnoreDAO; +import com.gempukku.lotro.db.PlayerDAO; import java.util.Map; import java.util.Set; @@ -10,14 +11,16 @@ import java.util.concurrent.ConcurrentHashMap; public class ChatServer extends AbstractServer { private IgnoreDAO ignoreDAO; + private PlayerDAO playerDAO; private Map _chatRooms = new ConcurrentHashMap(); - public ChatServer(IgnoreDAO ignoreDAO) { + public ChatServer(IgnoreDAO ignoreDAO, PlayerDAO playerDAO) { this.ignoreDAO = ignoreDAO; + this.playerDAO = playerDAO; } public ChatRoomMediator createChatRoom(String name, boolean muteJoinPartMessages, int secondsTimeoutPeriod, boolean allowIncognito, String welcomeMessage) { - ChatRoomMediator chatRoom = new ChatRoomMediator(ignoreDAO, name, muteJoinPartMessages, secondsTimeoutPeriod, allowIncognito, welcomeMessage); + ChatRoomMediator chatRoom = new ChatRoomMediator(ignoreDAO, playerDAO, name, muteJoinPartMessages, secondsTimeoutPeriod, allowIncognito, welcomeMessage); try { chatRoom.sendMessage("System", "Welcome to room: " + name, true); } catch (PrivateInformationException exp) { @@ -30,7 +33,7 @@ public class ChatServer extends AbstractServer { } public ChatRoomMediator createPrivateChatRoom(String name, boolean muteJoinPartMessages, Set allowedUsers, int secondsTimeoutPeriod) { - ChatRoomMediator chatRoom = new ChatRoomMediator(ignoreDAO, name, muteJoinPartMessages, secondsTimeoutPeriod, allowedUsers, false); + ChatRoomMediator chatRoom = new ChatRoomMediator(ignoreDAO, playerDAO, name, muteJoinPartMessages, secondsTimeoutPeriod, allowedUsers, false); try { chatRoom.sendMessage("System", "Welcome to private room: " + name, true); } catch (PrivateInformationException exp) { diff --git a/gemp-lotr/gemp-lotr-server/src/main/java/com/gempukku/lotro/collection/CollectionSerializer.java b/gemp-lotr/gemp-lotr-server/src/main/java/com/gempukku/lotro/collection/CollectionSerializer.java index 5050d4f96..a2ba853b4 100644 --- a/gemp-lotr/gemp-lotr-server/src/main/java/com/gempukku/lotro/collection/CollectionSerializer.java +++ b/gemp-lotr/gemp-lotr-server/src/main/java/com/gempukku/lotro/collection/CollectionSerializer.java @@ -59,10 +59,22 @@ public class CollectionSerializer { //April 2021 PC Promos _singleByteCountItems.add("11_267"); _singleByteCountItems.add("11_268"); - + //August 2021 PC Promos _singleByteCountItems.add("1_366"); _singleByteCountItems.add("1_367"); + + //September 2021 PC Promos + _singleByteCountItems.add("9_53"); + _singleByteCountItems.add("10_123"); + + //October 2021 PC Promos + _singleByteCountItems.add("1_368"); + _singleByteCountItems.add("1_369"); + + //November 2021 PC Promos + _singleByteCountItems.add("8_123"); + _singleByteCountItems.add("9_54"); } private void fillDoubleByteItems() throws IOException { diff --git a/gemp-lotr/gemp-lotr-server/src/main/java/com/gempukku/lotro/db/CachedPlayerDAO.java b/gemp-lotr/gemp-lotr-server/src/main/java/com/gempukku/lotro/db/CachedPlayerDAO.java index 43705a202..b7ac7e585 100644 --- a/gemp-lotr/gemp-lotr-server/src/main/java/com/gempukku/lotro/db/CachedPlayerDAO.java +++ b/gemp-lotr/gemp-lotr-server/src/main/java/com/gempukku/lotro/db/CachedPlayerDAO.java @@ -5,14 +5,13 @@ import com.gempukku.lotro.game.Player; import org.apache.commons.collections.map.LRUMap; import java.sql.SQLException; -import java.util.Collections; -import java.util.List; -import java.util.Map; +import java.util.*; public class CachedPlayerDAO implements PlayerDAO, Cached { private PlayerDAO _delegate; private Map _playerById = Collections.synchronizedMap(new LRUMap(500)); private Map _playerByName = Collections.synchronizedMap(new LRUMap(500)); + private Set _bannedUsernames = new HashSet<>(); public CachedPlayerDAO(PlayerDAO delegate) { _delegate = delegate; @@ -22,6 +21,7 @@ public class CachedPlayerDAO implements PlayerDAO, Cached { public void clearCache() { _playerById.clear(); _playerByName.clear(); + _bannedUsernames.clear(); } @Override @@ -74,6 +74,13 @@ public class CachedPlayerDAO implements PlayerDAO, Cached { return _delegate.findSimilarAccounts(login); } + @Override + public Set getBannedUsernames() throws SQLException { + if(_bannedUsernames.isEmpty()) + _bannedUsernames = _delegate.getBannedUsernames(); + return new HashSet<>(_bannedUsernames); + } + @Override public Player getPlayer(int id) { Player player = (Player) _playerById.get(id); diff --git a/gemp-lotr/gemp-lotr-server/src/main/java/com/gempukku/lotro/db/DbPlayerDAO.java b/gemp-lotr/gemp-lotr-server/src/main/java/com/gempukku/lotro/db/DbPlayerDAO.java index 8bfa841ae..d693b2efd 100644 --- a/gemp-lotr/gemp-lotr-server/src/main/java/com/gempukku/lotro/db/DbPlayerDAO.java +++ b/gemp-lotr/gemp-lotr-server/src/main/java/com/gempukku/lotro/db/DbPlayerDAO.java @@ -7,9 +7,7 @@ import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; -import java.util.Date; -import java.util.LinkedList; -import java.util.List; +import java.util.*; public class DbPlayerDAO implements PlayerDAO { private final String validLoginChars = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789-_"; @@ -75,6 +73,26 @@ public class DbPlayerDAO implements PlayerDAO { } } + @Override + public Set getBannedUsernames() throws SQLException { + try { + try (Connection connection = _dbAccess.getDataSource().getConnection()) { + try (PreparedStatement statement = connection.prepareStatement("SELECT name FROM player WHERE type = '' ORDER BY ID DESC LIMIT 50")) { + + try (ResultSet resultSet = statement.executeQuery()) { + TreeSet users = new TreeSet(); + while (resultSet.next()) { + users.add(resultSet.getString(1)); + } + return users; + } + } + } + } catch (SQLException exp) { + throw new RuntimeException("Unable to get banned users", exp); + } + } + @Override public boolean banPlayerPermanently(String login) throws SQLException { try (Connection conn = _dbAccess.getDataSource().getConnection()) { diff --git a/gemp-lotr/gemp-lotr-server/src/main/java/com/gempukku/lotro/db/PlayerDAO.java b/gemp-lotr/gemp-lotr-server/src/main/java/com/gempukku/lotro/db/PlayerDAO.java index d4185a4fb..dbf87fd46 100644 --- a/gemp-lotr/gemp-lotr-server/src/main/java/com/gempukku/lotro/db/PlayerDAO.java +++ b/gemp-lotr/gemp-lotr-server/src/main/java/com/gempukku/lotro/db/PlayerDAO.java @@ -4,6 +4,7 @@ import com.gempukku.lotro.game.Player; import java.sql.SQLException; import java.util.List; +import java.util.Set; public interface PlayerDAO { public Player getPlayer(int id); @@ -20,6 +21,7 @@ public interface PlayerDAO { public boolean removePlayerFlag(String login, String flag) throws SQLException; public List findSimilarAccounts(String login) throws SQLException; + public Set getBannedUsernames() throws SQLException; public Player loginUser(String login, String password) throws SQLException; diff --git a/gemp-lotr/gemp-lotr-server/src/main/resources/lotrFormats.json b/gemp-lotr/gemp-lotr-server/src/main/resources/lotrFormats.json index b9af859ff..172ae776d 100644 --- a/gemp-lotr/gemp-lotr-server/src/main/resources/lotrFormats.json +++ b/gemp-lotr/gemp-lotr-server/src/main/resources/lotrFormats.json @@ -55,6 +55,14 @@ "4_304":"54_304", "7_49":"57_49", "7_96":"57_96", "8_1":"58_1", "10_2":"60_2", "10_11":"60_11", "10_91":"60_91", "11_31":"61_31", "11_100":"61_100", "11_114":"61_114", "11_132":"61_132", "13_188":"63_188", "15_64":"65_64"} }, + { + "name":"Pre-Hunters Expanded", + "code":"pre-hunters_expanded", + "sites":"SHADOWS", + "banned":["1_45", "1_138", "1_234", "1_311", "1_313", "1_316", "2_121", "3_17", "3_38", "3_42", "3_67", "3_68", "3_108", "3_113", "4_73", "7_49", "8_1", "10_2", "10_11", "10_91", "11_31", "11_100", "11_132"], + "restricted":["1_40", "1_80", "1_108", "1_139", "1_195", "1_248", "2_32", "2_75", "3_106", "4_276", "4_304"], + "set":[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14] + }, { "name":"Fellowship block - Set 1", "code":"fotr1_block", @@ -127,6 +135,15 @@ "banned":["1_40", "1_45", "1_80", "1_108", "1_139", "1_234", "1_248", "1_313", "2_32", "2_101", "2_108", "3_38", "3_42", "3_68", "4_192"], "set":[1, 2, 3, 4, 5, 6] }, + { + "name":"Enhanced Towers Standard", + "code":"ts_reflections", + "sites":"TWO_TOWERS", + "cancelRingBearerSkirmish":false, + "banned":["1_40", "1_45", "1_80", "1_108", "1_139", "1_234", "1_248", "1_313", "2_32", "2_101", "2_108", "3_38", "3_42", "3_68", "4_192"], + "set":[1, 2, 3, 4, 5, 6, 9, 14, 16], + "hall":true + }, { "name": "Anything goes", "code":"rev_tow_sta", @@ -161,15 +178,6 @@ "set":[2, 3, 4, 5, 6], "hall":false }, - { - "name":"Towers standard - Sets 1-6,9,14,16", - "code":"ts_reflections", - "sites":"TWO_TOWERS", - "cancelRingBearerSkirmish":false, - "banned":["1_40", "1_45", "1_80", "1_108", "1_139", "1_234", "1_248", "1_313", "2_32", "2_101", "2_108", "3_38", "3_42", "3_68", "4_192"], - "set":[1, 2, 3, 4, 5, 6, 9, 14, 16], - "hall":false - }, { "name":"King Standard", "code":"rotk_sta",