Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- package com.l2jfrozen.gameserver.powerpak.Servers.Services;
- import java.io.IOException;
- import java.io.OutputStream;
- import java.net.URLDecoder;
- import java.sql.Connection;
- import java.sql.PreparedStatement;
- import java.sql.Timestamp;
- import java.util.Map;
- import java.util.StringTokenizer;
- import java.util.logging.Level;
- import java.util.logging.Logger;
- import javolution.util.FastMap;
- import com.l2jfrozen.Config;
- import com.l2jfrozen.L2Properties;
- import com.l2jfrozen.gameserver.datatables.sql.ItemTable;
- import com.l2jfrozen.gameserver.model.L2World;
- import com.l2jfrozen.gameserver.model.actor.instance.L2PcInstance;
- import com.l2jfrozen.gameserver.powerpak.L2Utils;
- import com.l2jfrozen.gameserver.util.sql.SQLQuery;
- import com.l2jfrozen.gameserver.util.sql.SQLQueue;
- import com.sun.net.httpserver.HttpExchange;
- import com.sun.net.httpserver.HttpHandler;
- public class PayStream implements HttpHandler
- {
- protected static final Logger _log = Logger.getLogger(PayStream.class.getName());
- // An indication that all options are read, and the handler can be created
- // Security Key - defined in the study Lisnoe paystream
- private static String _KEY;
- // Prefix SMS
- private static String _SMSPrefix;
- // ID object, given by a reward
- protected static int _item;
- // The list of numbers and quantities awards for a number. Format: count [; number: the number ...]
- private static Map<Integer, Integer> _bonuses = new FastMap<Integer, Integer>();
- private static String _MessageOK;
- private static String _MessageFail;
- protected static String _UserMessage;
- public PayStream() throws Exception
- {
- // Parse the config, which lies in the config / powerpak / webservices / paystream.properties
- L2Properties p = new L2Properties("./config/powerpak/webservices/paystream.properties");
- _KEY = p.getProperty("SecurityKey", "");
- _item = Integer.parseInt(p.getProperty("RewardItem", "0"));
- _MessageFail = L2Utils.loadMessage(p.getProperty("MessageFail", "Character %s does not exists"));
- _MessageOK = L2Utils.loadMessage(p.getProperty("MessageOK", "%d CoL added for %s"));
- _SMSPrefix = p.getProperty("SMSPrefix", "");
- _UserMessage = L2Utils.loadMessage(p.getProperty("MessageForUser", ""));
- if(ItemTable.getInstance().getTemplate(_item) == null)
- throw new Exception("Reward item (" + _item + ") does not exits");
- StringTokenizer st = new StringTokenizer(p.getProperty("AmountForNumbers", ""), ";");
- while(st.hasMoreTokens())
- {
- String token = st.nextToken();
- try
- {
- int iPos = token.indexOf(":");
- if(iPos != 0)
- {
- int number = Integer.parseInt(token.substring(0, iPos));
- int reward = Integer.parseInt(token.substring(iPos + 1));
- _bonuses.put(number, reward);
- }
- }
- catch(NumberFormatException e)
- {
- if(Config.ENABLE_ALL_EXCEPTIONS)
- e.printStackTrace();
- continue;
- }
- }
- }
- private class PaymentUpdate implements SQLQuery
- {
- private String _charName;
- private L2PcInstance _char;
- private int _count;
- private Map<String, String> _params;
- public PaymentUpdate(String charName, int count, Map<String, String> params, L2PcInstance player)
- {
- _charName = charName;
- _count = count;
- _params = params;
- _char = player;
- }
- @Override
- public void execute(Connection con)
- {
- try
- {
- // Stores the result in the database, at the same time check to see whether we re pulling peystrim.
- PreparedStatement stm = con.prepareStatement("insert into paystream select ?,?,?,?,?,?,? from " + " characters where not exists (select * from paystream where msgid=?) limit 1");
- stm.setString(1, _params.get("smsid"));
- stm.setString(8, _params.get("smsid"));
- stm.setTimestamp(2, Timestamp.valueOf(_params.get("date")));
- stm.setString(3, _params.get("user_id"));
- stm.setString(4, _params.get("num"));
- stm.setString(5, _charName);
- stm.setFloat(6, Float.parseFloat(_params.get("cost")));
- stm.setString(7, _params.get("currency"));
- boolean isOk = stm.executeUpdate() > 0; // Yes, I must add a user to aytemov.
- if(isOk && _char != null)
- {
- _char.addItem("donate", _item, _count, null, true);
- if(_char.isOnline() != 0 && _UserMessage.length() > 0)
- _char.sendMessage(_UserMessage);
- _char.store();
- }
- stm.close();
- }
- catch(Exception e)
- {
- if(Config.ENABLE_ALL_EXCEPTIONS)
- e.printStackTrace();
- _log.log(Level.WARNING, "WebServer: Paystream can't update data : " + e);
- }
- }
- }
- @Override
- public void handle(HttpExchange params) throws IOException
- {
- /* !! WARNING!
- * Paystream supports prefixes beginning with a +
- * HttpServer already decodes from UrlEncode getQuery (), however,
- * It does not decode + as space. The result is a "curve" line
- + + Perfiks imya_chara
- * This is not true, because Line dodzhna be + prefix imya_chara
- *
- */
- if(params.getRequestMethod().equalsIgnoreCase("GET"))
- {
- FastMap<String, String> query = new FastMap<String, String>();
- StringBuffer response = new StringBuffer();
- // Parse the parameters passed in the GET request
- StringTokenizer st = new StringTokenizer(params.getRequestURI().getQuery(), "&");
- while(st.hasMoreTokens())
- {
- String token = st.nextToken();
- int iPos = token.indexOf("=");
- if(iPos != -1)
- {
- String param = token.substring(0, iPos).toLowerCase();
- String value = token.substring(iPos + 1);
- // That is the replacement of which is written above..
- if(value != null && value.length() > 0)
- {
- if(value.charAt(0) == '+')
- value = "+" + URLDecoder.decode(value.substring(1), "UTF-8");
- else
- value = URLDecoder.decode(value, "UTF-8");
- }
- query.put(param, value);
- }
- }
- // Check whether there is a secret key and our Do it as well as other required parameters.
- if(query.get("skey") != null && query.get("skey").equals(_KEY) && query.get("num") != null)
- {
- String SMSText = query.get("msg"); // Take the text of the SMS
- if(SMSText != null)
- {
- int iPos = SMSText.indexOf(" ");
- if(iPos != -1)
- {
- String prefix = SMSText.substring(0, iPos).trim();
- String charName = SMSText.substring(iPos + 1).trim();
- boolean prefixOk = _SMSPrefix.length() > 0 ? prefix.equals(_SMSPrefix) : true;
- if(prefixOk)
- { // Checked for a match prefix (just in case)
- try
- {
- Integer amount = _bonuses.get(Integer.parseInt(query.get("num")));
- if(amount == null) // Indicate whether our number is on the list?
- amount = 1; // No, the issue one aytemov
- response.append("status: reply\n\n"); // Header that the request should be returned to PayStream
- L2PcInstance pc = L2World.getInstance().getPlayer(charName);
- if(pc == null)
- pc = L2Utils.loadPlayer(charName);
- SQLQueue.getInstance().add(new PaymentUpdate(charName, amount, query, pc));
- if(pc != null)
- response.append(String.format(_MessageOK, amount, charName));
- else
- response.append(String.format(_MessageFail, charName));
- _log.info("WebServer: Paystream accepted payment from " + query.get("user_id") + " for character " + charName);
- }
- catch(NumberFormatException e)
- {
- e.printStackTrace();
- }
- }
- }
- }
- }
- params.sendResponseHeaders(200, response.length());
- OutputStream os = params.getResponseBody();
- os.write(response.toString().getBytes());
- os.close();
- }
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement