Здравствуйте, Гость ( Вход | Регистрация )

Правила | Поиск | Помощь | Участники | Репутация


  ОтветитьНовая темаНовый опрос
ява скрипт, проблема с парсером
« Предыдущая тема | Следующая тема » Версия для печати
R]e[D
27 Jun 2011, 22:38  


Сейчас вне форума
Группа: Фанат форума
Сообщений: 1873
Репутация: 29
Регистрация: 28 Jan 05


Доброго времени суток всем. От нечего делать решил запустить эмулятор сервера ла2. Появилась необходимость в ява скрипте который будет парсить с топа инфу о проголосовавших и выдавать награду. Вот собственно сам скрипт:
Код:
package services;

import l2p.Config;

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.URL;
import java.sql.ResultSet;
import java.util.Calendar;
import java.util.StringTokenizer;
import java.util.logging.Logger;

import l2p.common.ThreadPoolManager;
import l2p.database.DatabaseUtils;
import l2p.database.FiltredPreparedStatement;
import l2p.database.L2DatabaseFactory;
import l2p.database.ThreadConnection;
import l2p.gameserver.model.L2ObjectsStorage;
import l2p.gameserver.model.L2Player;
import l2p.gameserver.model.items.PcInventory;
import l2p.gameserver.modules.option.mOption;

public class VoteManager
{
 BufferedReader reader;
 public static Logger log = Logger.getLogger(VoteManager.class.getName());
 public static VoteManager ourInstance = new VoteManager();

 public static VoteManager getInstance()
 {
   return ourInstance;
 }

 public VoteManager()
 {
   if (Config.L2VOTEMANAGER_ENABLE)
   {
     ThreadPoolManager.getInstance().scheduleGeneralAtFixedRate(new startParce(), 60000L, Config.L2VOTEMANAGER_TIME * 60 * 1000);
   }
 }

 public void getPage(String address)
 {
   try
   {
     URL url = new URL(address);
     this.reader = new BufferedReader(new InputStreamReader(url.openStream(), "windows-1251"));
     //log.warning("VoteManager: Succes L2Top url parse.");
   }
   catch (Exception e)
   {
    log.warning("VoteManager: Error L2Top url parse.");
    //e.printStackTrace();
   }
 }

 public void parse()
 {
   int i = 0;
   try
   {
     String line;
     while ((line = this.reader.readLine()) != null)
     {
       StringTokenizer st = new StringTokenizer(line, "- :\t");
       while (st.hasMoreTokens())
       {
         try
         {
           int year = Integer.parseInt(st.nextToken());
           int month = Integer.parseInt(st.nextToken());
           int day = Integer.parseInt(st.nextToken());
           int hour = Integer.parseInt(st.nextToken());
           int minute = Integer.parseInt(st.nextToken());
           int second = Integer.parseInt(st.nextToken());
           String name = st.nextToken();
           L2Player player = L2ObjectsStorage.getPlayer(name);
           if ((player != null) && (player.isOnline()))
           {
             Calendar calendar = Calendar.getInstance();
             calendar.set(1, year);
             calendar.set(2, month);
             calendar.set(5, day);
             calendar.set(11, hour);
             calendar.set(12, minute);
             calendar.set(13, second);
             calendar.set(14, 0);
             long time = calendar.getTimeInMillis() / 1000L;
             checkAndSave(name, time);
           }
           i++;
         }
         catch (Exception e)
         {
         }
       }
     }
   }
   catch (Exception e)
   {
    log.warning("VoteManager: Error L2Top storing data.");
    //e.printStackTrace();
   }
 }

 public void checkAndSave(String name, long time)
 {
   ThreadConnection tc = null;
   FiltredPreparedStatement fps = null;
   ResultSet rs = null;
   try
   {
     tc = L2DatabaseFactory.getInstance().getConnection();
     fps = tc.prepareStatement("SELECT * FROM `character_l2top_votes` WHERE `name`=? AND `time`=? LIMIT 1");
     fps.setString(1, name);
     fps.setLong(2, time);
     rs = fps.executeQuery();
     if (!rs.next())
     {
       L2Player player = L2ObjectsStorage.getPlayer(name);
       if ((player != null) && (player.isOnline()))
       {
         player.getInventory().addItem(Config.L2VOTEMANAGER_REWARD_ID, Config.L2VOTEMANAGER_REWARD_KEY);
         player.sendMessage("Вам начислено " + Config.L2VOTEMANAGER_REWARD_KEY + " " + mOption.getItemName(Config.L2VOTEMANAGER_REWARD_ID) + " за голосование в рейтинге L2Top.");
         fps = tc.prepareStatement("INSERT INTO `character_l2top_votes` (`name`, `time`) VALUES (?, ?)");
         fps.setString(1, name);
         fps.setLong(2, time);
         fps.execute();
       }
     }
   }
   catch (Exception e)
   {
    e.printStackTrace();
   }
   finally
   {
     DatabaseUtils.closeDatabaseCSR(tc, fps, rs);
   }
 }

 public class startParce
   implements Runnable
 {
   public startParce()
   {
   }

    public void run()
    {
        try
        {
          VoteManager.this.getPage("http://l2top.ru/editServ/?adminAct=lastVotes&uid=" + Config.L2TOP_ID + "&key=" + Config.L2TOP_KEY);
          VoteManager.this.parse();
        }
        catch (Exception e)
        {
         e.printStackTrace();
        }
      }
 }
}

Проблема в том, что скрипт почему-то парсит каждый интервал времени 2 раза и соответственно выдает награду те же 2 раза, а нужно чтобы парсил каждый интервал времени 1 раз и выдавал награду 1 раз. Знаний в Яве у меня чуть менее чем ничего, бОльшая часть скрипта понятна, но решить проблему так и не смог. =( Буду благодарен за любую помощь.
 
 
0 ответов с 27 Jun 2011, 22:38 Версия для печати

<< Назад в Программирование
ОтветитьНовая темаНовый опрос