diff --git a/gemp-lotr/gemp-lotr-async/src/main/java/com/gempukku/lotro/async/handler/LeagueRequestHandler.java b/gemp-lotr/gemp-lotr-async/src/main/java/com/gempukku/lotro/async/handler/LeagueRequestHandler.java index 5573ffaf5..c4d11b9ee 100644 --- a/gemp-lotr/gemp-lotr-async/src/main/java/com/gempukku/lotro/async/handler/LeagueRequestHandler.java +++ b/gemp-lotr/gemp-lotr-async/src/main/java/com/gempukku/lotro/async/handler/LeagueRequestHandler.java @@ -23,6 +23,7 @@ import org.w3c.dom.Element; import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; import java.lang.reflect.Type; +import java.net.InetSocketAddress; import java.text.DecimalFormat; import java.util.Collection; import java.util.List; @@ -64,7 +65,7 @@ public class LeagueRequestHandler extends LotroServerRequestHandler implements U if (league == null) throw new HttpProcessingException(404); - if (!_leagueService.playerJoinsLeague(league, resourceOwner, e.getRemoteAddress().toString())) + if (!_leagueService.playerJoinsLeague(league, resourceOwner, ((InetSocketAddress) e.getRemoteAddress()).getHostName())) throw new HttpProcessingException(409); responseWriter.writeXmlResponse(null); diff --git a/gemp-lotr/gemp-lotr-async/src/main/java/com/gempukku/lotro/async/handler/LoginRequestHandler.java b/gemp-lotr/gemp-lotr-async/src/main/java/com/gempukku/lotro/async/handler/LoginRequestHandler.java index 1cf710d7c..3c58a8be6 100644 --- a/gemp-lotr/gemp-lotr-async/src/main/java/com/gempukku/lotro/async/handler/LoginRequestHandler.java +++ b/gemp-lotr/gemp-lotr-async/src/main/java/com/gempukku/lotro/async/handler/LoginRequestHandler.java @@ -25,7 +25,11 @@ public class LoginRequestHandler extends LotroServerRequestHandler implements Ur Player player = _playerDao.loginUser(login, password); if (player != null) { if (player.getType().contains("u")) { - responseWriter.writeXmlResponse(null, logUserReturningHeaders(e, login)); + if (player.getType().contains("a")) { + responseWriter.writeXmlResponse(null, logUserReturningHeaders(e, login)); + } else { + responseWriter.writeError(503); + } } else { responseWriter.writeError(403); } diff --git a/gemp-lotr/gemp-lotr-async/src/main/java/com/gempukku/lotro/async/handler/LotroServerRequestHandler.java b/gemp-lotr/gemp-lotr-async/src/main/java/com/gempukku/lotro/async/handler/LotroServerRequestHandler.java index 0ea249d71..afbd31139 100644 --- a/gemp-lotr/gemp-lotr-async/src/main/java/com/gempukku/lotro/async/handler/LotroServerRequestHandler.java +++ b/gemp-lotr/gemp-lotr-async/src/main/java/com/gempukku/lotro/async/handler/LotroServerRequestHandler.java @@ -20,6 +20,7 @@ import org.jboss.netty.handler.codec.http.multipart.InterfaceHttpData; import java.io.IOException; import java.lang.reflect.Type; +import java.net.InetSocketAddress; import java.sql.SQLException; import java.util.Collections; import java.util.LinkedList; @@ -132,7 +133,7 @@ public class LotroServerRequestHandler { } protected Map logUserReturningHeaders(MessageEvent e, String login) throws SQLException { - _playerDao.updateLastLoginIp(login, e.getChannel().getRemoteAddress().toString()); + _playerDao.updateLastLoginIp(login, ((InetSocketAddress) e.getChannel().getRemoteAddress()).getHostName()); CookieEncoder cookieEncoder = new CookieEncoder(true); for (Map.Entry cookie : _loggedUserHolder.logUser(login).entrySet()) diff --git a/gemp-lotr/gemp-lotr-async/src/main/java/com/gempukku/lotro/async/handler/RegisterRequestHandler.java b/gemp-lotr/gemp-lotr-async/src/main/java/com/gempukku/lotro/async/handler/RegisterRequestHandler.java index 04670a807..c98df1a2a 100644 --- a/gemp-lotr/gemp-lotr-async/src/main/java/com/gempukku/lotro/async/handler/RegisterRequestHandler.java +++ b/gemp-lotr/gemp-lotr-async/src/main/java/com/gempukku/lotro/async/handler/RegisterRequestHandler.java @@ -1,12 +1,9 @@ package com.gempukku.lotro.async.handler; -import com.gempukku.lotro.async.HttpProcessingException; import com.gempukku.lotro.async.ResponseWriter; -import com.gempukku.lotro.db.LoginInvalidException; import org.jboss.netty.channel.MessageEvent; import org.jboss.netty.handler.codec.http.HttpMethod; import org.jboss.netty.handler.codec.http.HttpRequest; -import org.jboss.netty.handler.codec.http.multipart.HttpPostRequestDecoder; import java.lang.reflect.Type; import java.util.Map; @@ -19,19 +16,21 @@ public class RegisterRequestHandler extends LotroServerRequestHandler implements @Override public void handleRequest(String uri, HttpRequest request, Map context, ResponseWriter responseWriter, MessageEvent e) throws Exception { if (uri.equals("") && request.getMethod() == HttpMethod.POST) { - HttpPostRequestDecoder postDecoder = new HttpPostRequestDecoder(request); - String login = getFormParameterSafely(postDecoder, "login"); - String password = getFormParameterSafely(postDecoder, "password"); - try { - if (_playerDao.registerUser(login, password, e.getRemoteAddress().toString())) { - responseWriter.writeXmlResponse(null, logUserReturningHeaders(e, login)); - } else { - throw new HttpProcessingException(409); - } - } catch (LoginInvalidException exp) { - throw new HttpProcessingException(400); - } - + responseWriter.writeError(503); +// +// HttpPostRequestDecoder postDecoder = new HttpPostRequestDecoder(request); +// String login = getFormParameterSafely(postDecoder, "login"); +// String password = getFormParameterSafely(postDecoder, "password"); +// try { +// if (_playerDao.registerUser(login, password, e.getRemoteAddress().toString())) { +// responseWriter.writeXmlResponse(null, logUserReturningHeaders(e, login)); +// } else { +// throw new HttpProcessingException(409); +// } +// } catch (LoginInvalidException exp) { +// throw new HttpProcessingException(400); +// } +// } else { responseWriter.writeError(404); } diff --git a/gemp-lotr/gemp-lotr-async/src/main/web/index.html b/gemp-lotr/gemp-lotr-async/src/main/web/index.html index bfdda3554..475f29668 100644 --- a/gemp-lotr/gemp-lotr-async/src/main/web/index.html +++ b/gemp-lotr/gemp-lotr-async/src/main/web/index.html @@ -70,21 +70,24 @@ $(".error").html("Password and Password repeated are different! Try again"); } else { comm.register(login, password, function() { - location.href="/gemp-lotr/hall.html"; + location.href = "/gemp-lotr/hall.html"; }, - { - "0": function() { - alert("Unable to connect to server, either server is down or there is a problem" + - " with your internet connection"); - }, - "400":function() { - $(".error").html("Login is invalid. Login must be between 2-10 characters long, and contain only
"+ - " english letters, numbers or _ (underscore) and - (dash) characters."); - }, - "409": function() { - $(".error").html("User with this login already exists in the system. Try a different one."); - } - }); + { + "0": function() { + alert("Unable to connect to server, either server is down or there is a problem" + + " with your internet connection"); + }, + "400":function() { + $(".error").html("Login is invalid. Login must be between 2-10 characters long, and contain only
" + + " english letters, numbers or _ (underscore) and - (dash) characters."); + }, + "409": function() { + $(".error").html("User with this login already exists in the system. Try a different one."); + }, + "503": function() { + $(".error").html("Server is down for maintenance. Please come at a later time."); + } + }); } } @@ -102,22 +105,25 @@ var login = $("#login").val(); var password = $("#password").val(); comm.login(login, password, function() { - location.href = "/gemp-lotr/hall.html"; - }, - { - "0": function() { - alert("Unable to connect to server, either server is down or there is a problem" + - " with your internet connection"); - }, - "401":function() { - $(".error").html("Invalid username or password. Try again."); - loginScreen(); - }, - "403": function() { - $(".error").html("You have been banned. If you think it was a mistake, please write an e-mail to marcins78@gmail.com"); + $(".interaction").html(""); + }, + "503": function() { + $(".error").html("Server is down for maintenance. Please come at a later time."); + } + }); } function loginScreen() { diff --git a/gemp-lotr/gemp-lotr-server/src/main/java/com/gempukku/lotro/merchant/MerchantService.java b/gemp-lotr/gemp-lotr-server/src/main/java/com/gempukku/lotro/merchant/MerchantService.java index 8a96e0600..c0b535b59 100644 --- a/gemp-lotr/gemp-lotr-server/src/main/java/com/gempukku/lotro/merchant/MerchantService.java +++ b/gemp-lotr/gemp-lotr-server/src/main/java/com/gempukku/lotro/merchant/MerchantService.java @@ -37,7 +37,7 @@ public class MerchantService { try { SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); format.setTimeZone(TimeZone.getTimeZone("GMT")); - setupDate = format.parse("2012-03-14 00:00:00"); + setupDate = format.parse("2013-03-31 00:00:00"); } catch (ParseException exp) { throw new RuntimeException("Unable to parse merchant setup date"); } diff --git a/gemp-lotr/gemp-lotr-server/src/main/java/com/gempukku/lotro/merchant/StorageBasedMerchant.java b/gemp-lotr/gemp-lotr-server/src/main/java/com/gempukku/lotro/merchant/StorageBasedMerchant.java index c645a3607..a35a2c6ac 100644 --- a/gemp-lotr/gemp-lotr-server/src/main/java/com/gempukku/lotro/merchant/StorageBasedMerchant.java +++ b/gemp-lotr/gemp-lotr-server/src/main/java/com/gempukku/lotro/merchant/StorageBasedMerchant.java @@ -93,7 +93,15 @@ public class StorageBasedMerchant implements Merchant { if (normalPrice == null) return null; - int price = Math.max(MIN_BUY_PRICE, (int) Math.floor(_profitMargin * normalPrice)); + int priceWithProfit = (int) Math.floor(_profitMargin * normalPrice); + + boolean outOfStock = (lastTransaction == null || lastTransaction.getStock() < OUT_OF_STOCK_MIN); + + // If card is out of stock, adjust the buy price, as it might be over-inflated (due to over-selling) + if (outOfStock) + priceWithProfit = priceWithProfit / OUT_OF_STOCK_MULTIPLIER; + + int price = Math.max(MIN_BUY_PRICE, priceWithProfit); if (foil) return FOIL_PRICE_MULTIPLIER * price; diff --git a/gemp-lotr/gemp-lotr-server/src/main/java/com/gempukku/lotro/tournament/DailyTournamentPrizes.java b/gemp-lotr/gemp-lotr-server/src/main/java/com/gempukku/lotro/tournament/DailyTournamentPrizes.java index 82dbc54ad..0ba0f5424 100644 --- a/gemp-lotr/gemp-lotr-server/src/main/java/com/gempukku/lotro/tournament/DailyTournamentPrizes.java +++ b/gemp-lotr/gemp-lotr-server/src/main/java/com/gempukku/lotro/tournament/DailyTournamentPrizes.java @@ -15,11 +15,11 @@ public class DailyTournamentPrizes implements TournamentPrizes { public CardCollection getPrizeForTournament(PlayerStanding playerStanding, int playersCount) { DefaultCardCollection tournamentPrize = new DefaultCardCollection(); if (playerStanding.getStanding() == 1) { - tournamentPrize.addItem("(S)Booster Choice", 8); + tournamentPrize.addItem("(S)Booster Choice", 10); } else if (playerStanding.getStanding() == 2) { - tournamentPrize.addItem("(S)Booster Choice", 5); + tournamentPrize.addItem("(S)Booster Choice", 8); } else if (playerStanding.getStanding() <=4) { - tournamentPrize.addItem("(S)Booster Choice", 4); + tournamentPrize.addItem("(S)Booster Choice", 5); } else if (playerStanding.getStanding()<=8) { tournamentPrize.addItem("(S)Booster Choice", 2); } @@ -36,6 +36,6 @@ public class DailyTournamentPrizes implements TournamentPrizes { @Override public String getPrizeDescription() { - return "
8-5-4-2
"; + return "
10-8-5-2
"; } } diff --git a/gemp-lotr/gemp-lotr-server/src/main/java/com/gempukku/lotro/tournament/SingleEliminationOnDemandPrizes.java b/gemp-lotr/gemp-lotr-server/src/main/java/com/gempukku/lotro/tournament/SingleEliminationOnDemandPrizes.java index dd5376425..8b31714bd 100644 --- a/gemp-lotr/gemp-lotr-server/src/main/java/com/gempukku/lotro/tournament/SingleEliminationOnDemandPrizes.java +++ b/gemp-lotr/gemp-lotr-server/src/main/java/com/gempukku/lotro/tournament/SingleEliminationOnDemandPrizes.java @@ -27,6 +27,7 @@ public class SingleEliminationOnDemandPrizes implements TournamentPrizes{ DefaultCardCollection tournamentPrize = new DefaultCardCollection(); if (playerStanding.getPoints() == 3) { tournamentPrize.addItem("(S)Booster Choice", 2); + tournamentPrize.addItem(getRandom(_promos), 1); } else if (playerStanding.getPoints() == 2) { tournamentPrize.addItem("(S)Booster Choice", 1); tournamentPrize.addItem(getRandom(_promos), 1); @@ -50,6 +51,6 @@ public class SingleEliminationOnDemandPrizes implements TournamentPrizes{ @Override public String getPrizeDescription() { - return "
2-(1+promo)-1-1
"; + return "
(2+promo)-(1+promo)-1-1
"; } } diff --git a/gemp-lotr/gemp-lotr-server/src/test/java/com/gempukku/lotro/merchant/MockMerchantDAO.java b/gemp-lotr/gemp-lotr-server/src/test/java/com/gempukku/lotro/merchant/MockMerchantDAO.java index 2a8f09737..97e4afe53 100644 --- a/gemp-lotr/gemp-lotr-server/src/test/java/com/gempukku/lotro/merchant/MockMerchantDAO.java +++ b/gemp-lotr/gemp-lotr-server/src/test/java/com/gempukku/lotro/merchant/MockMerchantDAO.java @@ -29,4 +29,8 @@ public class MockMerchantDAO implements MerchantDAO { return new Transaction(_dates.get(blueprintId), _prices.get(blueprintId), _transactionTypes.get(blueprintId), _stock.get(blueprintId)); return null; } + + public void setStock(String blueprintId, int count) { + _stock.put(blueprintId, count); + } } diff --git a/gemp-lotr/gemp-lotr-server/src/test/java/com/gempukku/lotro/merchant/StorageBasedMerchantTest.java b/gemp-lotr/gemp-lotr-server/src/test/java/com/gempukku/lotro/merchant/StorageBasedMerchantTest.java index 4f4175811..5510b4cee 100644 --- a/gemp-lotr/gemp-lotr-server/src/test/java/com/gempukku/lotro/merchant/StorageBasedMerchantTest.java +++ b/gemp-lotr/gemp-lotr-server/src/test/java/com/gempukku/lotro/merchant/StorageBasedMerchantTest.java @@ -3,24 +3,24 @@ package com.gempukku.lotro.merchant; import com.gempukku.lotro.cards.CardSets; import com.gempukku.lotro.db.MerchantDAO; import com.gempukku.lotro.game.LotroCardBlueprintLibrary; +import static org.junit.Assert.*; import org.junit.Before; import org.junit.Test; import java.util.Date; -import static org.junit.Assert.*; - public class StorageBasedMerchantTest { private StorageBasedMerchant _merchant; private CardSets _cardSets = new CardSets(); private static final long DAY = 1000 * 60 * 60 * 24; + private MockMerchantDAO _merchantDao; @Before public void setup() { Date setupDate = new Date(0); - MerchantDAO merchantDao = new MockMerchantDAO(); + _merchantDao = new MockMerchantDAO(); - _merchant = new StorageBasedMerchant(new LotroCardBlueprintLibrary(), merchantDao, setupDate, _cardSets); + _merchant = new StorageBasedMerchant(new LotroCardBlueprintLibrary(), _merchantDao, setupDate, _cardSets); } @Test @@ -77,6 +77,37 @@ public class StorageBasedMerchantTest { assertTrue(initialPrice > _merchant.getCardBuyPrice("1_1", new Date(DAY))); } + @Test + public void buyAndSellLosesOnValue() { + _merchantDao.setStock("1_1", 2); + + long time = 0; + // Buy 5 times the same card every 10 seconds, then sell the 5, also every 10 sec + int moneySpent = 0; + int moneyEarned = 0; + for (int i=0; i<5; i++) { + int sellPrice = _merchant.getCardSellPrice("1_1", new Date(time)); + moneySpent+=sellPrice; + _merchant.cardSold("1_1", new Date(time), sellPrice); + System.out.println("Bought for: "+sellPrice); + time+=10*1000; + } + + System.out.println("Selling for : "+_merchant.getCardSellPrice("1_1", new Date(time))); + System.out.println("Buying for: "+_merchant.getCardBuyPrice("1_1", new Date(time))); + + for (int i=0; i<5; i++) { + int buyPrice = _merchant.getCardBuyPrice("1_1", new Date(time)); + moneyEarned+=buyPrice; + _merchant.cardBought("1_1", new Date(time), buyPrice); + System.out.println("Sold for: "+buyPrice); + time+=10*1000; + } + System.out.println("Money spent: "+moneySpent); + System.out.println("Money earned: "+moneyEarned); + assertTrue(moneySpent>moneyEarned); + } + // @Test public void plotPricesAfterTransactions() { Date setupDate = new Date(-1000 * 60 * 60 * 24 * 50L);