• Новые темы в этом разделе публикуются автоматически при добавлении файла в менеджер ресурсов.
    Ручное создание новых тем невозможно.
Иконка ресурса

Мануал Выдача наград за голосование

ZombieXLX

Единомышленник
Участник
Сообщения
36
Розыгрыши
0
Репутация
20
Реакции
16
Баллы
188
ZombieXLX добавил(а) новый ресурс:

Выдача наград за голосование - L2TOP на SOP :D

Пример выдачи призов за голосовалку на l2top не реклама, только его и знаю.
Понадобится таблица куда будем сгружать полученные парсером даты и имена чаров.
Будет она в базе lin2db
SQL:
USE [lin2db]
GO

/****** Object:  Table [dbo].[votes]    Script Date: 07/02/2024 08:33:22 ******/
SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
GO

CREATE TABLE [dbo].[votes](
    [Id] [int] IDENTITY(1,1) NOT NULL,
    [Date] [datetime] NULL,
    [char_name] [nvarchar](255) NULL...

Узнать больше об этом ресурсе...
 

ZombieXLX обновил(а) ресурс Выдача наград за голосование новой записью:

Версия без киков.

Пример выдачи призов за голосовалку на l2top не реклама, только его и знаю.
Понадобится таблица куда будем сгружать полученные парсером даты и имена чаров.
Будет она в базе lin2db
SQL:
USE [lin2db]
GO

/****** Object:  Table [dbo].[votes]    Script Date: 07/02/2024 08:33:22 ******/
SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
GO

CREATE TABLE [dbo].[votes](
    [Id] [int] IDENTITY(1,1) NOT NULL,
    [Date] [datetime] NULL,
    [char_name] [nvarchar](255) NULL...

Узнать больше об этом обновлении...
 
  • Мне нравится
Реакции: kick
ZombieXLX обновил(а) ресурс Выдача наград за голосование новой записью:

Обновление 1 (убрал кик, добавил описание к возвращаемому коду)

В это обновлении убран кик при голосовании, теперь скрипт будет дожидаться выхода из игры, чтобы выдать бонус, ну и добавлена расшифровка кодов, теперь можно дебажить скрипт.

Узнать больше об этом обновлении...
 
  • Мне нравится
Реакции: kick
Оверпостинг
Код:
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.net.Socket;
import java.nio.ByteBuffer;
import java.nio.ByteOrder;

public class CacheD {
    private String cachedIp;
    private int cachedPort;
    private String webadmin;
    private boolean connected;
    private boolean fsockError;
    private boolean[] socketErrors;

    public CacheD(String cachedIp, int cachedPort, String webadmin) {
        this.cachedIp = cachedIp;
        this.cachedPort = cachedPort;
        this.webadmin = webadmin;
        this.connected = false;
        this.fsockError = false;
        this.socketErrors = new boolean[27];
        this.socketErrors[0] = true;
    }

    private byte[] toUnicode(String string) {
        StringBuilder sb = new StringBuilder();
        for (int i = 0; i < string.length(); i++) {
            sb.append(string.charAt(i)).append('\0');
        }
        sb.append('\0').append('\0');
        try {
            return sb.toString().getBytes("UTF-16LE");
        } catch (UnsupportedEncodingException e) {
            throw new RuntimeException(e);
        }
    }

    private boolean cacheDInteractive(byte[] buf) {
        try (Socket sock = new Socket(cachedIp, cachedPort)) {
            this.connected = true;
            byte[] packetLength = ByteBuffer.allocate(2).order(ByteOrder.LITTLE_ENDIAN).putShort((short) (buf.length + 2)).array();
            byte[] packet = new byte[packetLength.length + buf.length];
            System.arraycopy(packetLength, 0, packet, 0, packetLength.length);
            System.arraycopy(buf, 0, packet, packetLength.length, buf.length);
            sock.getOutputStream().write(packet);
            byte[] lengthData = new byte[2];
            sock.getInputStream().read(lengthData);
            int length = ByteBuffer.wrap(lengthData).order(ByteOrder.LITTLE_ENDIAN).getShort() & 0xFFFF;
            byte[] responseIdData = new byte[1];
            sock.getInputStream().read(responseIdData);
            byte responseId = responseIdData[0];
            byte[] responseData = new byte[length - 3];
            sock.getInputStream().read(responseData);
            StringBuilder rs = new StringBuilder();
            for (int i = 0; i < responseData.length; i += 4) {
                byte[] readData = new byte[4];
                System.arraycopy(responseData, i, readData, 0, Math.min(4, responseData.length - i));
                int read = ByteBuffer.wrap(readData).order(ByteOrder.LITTLE_ENDIAN).getInt();
                rs.append(read);
            }
            int index = Integer.parseInt(rs.toString());
            return index < this.socketErrors.length ? this.socketErrors[index] : false;
        } catch (IOException e) {
            this.connected = false;
            this.fsockError = true;
            return this.fsockError;
        }
    }

    public boolean addItem2Packet(int charId, int warehouse, int itemType, long q, int enchant, int eroded, int bless, int wished) {
        int qh = (int) (q / 0x100000000L);
        if (qh < 0) {
            qh = 0;
        } else {
            q -= qh * 0x100000000L;
        }
        ByteBuffer buf = ByteBuffer.allocate(128).order(ByteOrder.LITTLE_ENDIAN);
        buf.put((byte) 55);
        buf.putInt(charId);
        buf.putInt(warehouse);
        buf.putInt(itemType);
        buf.putInt((int) q);
        buf.putInt(qh);
        buf.putInt(enchant);
        buf.putInt(eroded);
        buf.putInt(bless);
        buf.putInt(wished);
        buf.putInt(0);
        buf.putInt(0);
        buf.putInt(0);
        buf.putInt(0);
        buf.putInt(0);
        buf.putInt(0);
        buf.putInt(0);
        buf.putInt(0);
        buf.putInt(0);
        buf.put(toUnicode(webadmin));
        return cacheDInteractive(buf.array());
    }

    public boolean checkCharacterPacket(int charId) {
        ByteBuffer buf = ByteBuffer.allocate(5 + toUnicode(webadmin).length).order(ByteOrder.LITTLE_ENDIAN);
        buf.put((byte) 1);
        buf.putInt(charId);
        buf.put(toUnicode(webadmin));
        return cacheDInteractive(buf.array());
    }

    public boolean kickCharacterPacket(int charId) {
        ByteBuffer buf = ByteBuffer.allocate(5 + toUnicode(webadmin).length).order(ByteOrder.LITTLE_ENDIAN);
        buf.put((byte) 5);
        buf.putInt(charId);
        buf.put(toUnicode(webadmin));
        return cacheDInteractive(buf.array());
    }
}

Код:
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;

public class VoteParser {
    public static void parseAndInsertVotes(String connectionString, String url) {
        try (Connection conn = DriverManager.getConnection(connectionString)) {
            String sql = "EXEC InsertVote @Date = ?, @char_name = ?";
            try (PreparedStatement stmt = conn.prepareStatement(sql)) {
                Document doc = Jsoup.connect(url).get();
                String text = doc.body().text();
                List<String[]> data = parseData(text);
                for (String[] row : data.subList(1, data.size())) {
                    if (row.length > 0 && !"http".equals(row[0])) {
                        stmt.setString(1, row[0]);
                        stmt.setString(2, row[1]);
                        stmt.executeUpdate();
                    }
                }
                conn.commit();
            }
        } catch (SQLException | IOException e) {
            e.printStackTrace();
        }
    }

    private static List<String[]> parseData(String text) {
        List<String[]> data = new ArrayList<>();
        for (String line : text.trim().split("\n")) {
            data.add(line.split("\t"));
        }
        return data;
    }
}

Код:
import java.sql.*;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;

public class VoteAndBonusManager {
    private static final String SERVER = "127.0.0.1";
    private static final String DATABASE = "lin2db";
    private static final String USERNAME = "user";
    private static final String PASSWORD = "password";
    private static final String DRIVER = "com.microsoft.sqlserver.jdbc.SQLServerDriver";
    private static final String CONNECTION_STRING = String.format(
            "jdbc:sqlserver://%s;databaseName=%s;user=%s;password=%s",
            SERVER, DATABASE, USERNAME, PASSWORD
    );
    private static final String VOTE_URL = "https://l2top.ru/editServ/?adminAct=lastVotes&uid=ВАШ_УИД&key=ВАШ_КЛЮЧ";
    private static final String CACHED_IP = "127.0.0.1";
    private static final int CACHED_PORT = 2012;
    private static final int ITEM_ID = 57;
    private static final int ITEM_COUNT = 1;

    public static void main(String[] args) {
        parseAndInsertVotes();
        manageCharacterBonuses();
    }

    private static void parseAndInsertVotes() {
        try (Connection conn = DriverManager.getConnection(CONNECTION_STRING);
             PreparedStatement stmt = conn.prepareStatement("EXEC InsertVote @Date = ?, @char_name = ?")) {
            VoteParser.parseAndInsertVotes(VOTE_URL, stmt);
            conn.commit();
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }

    private static void manageCharacterBonuses() {
        try (Connection conn = DriverManager.getConnection(CONNECTION_STRING);
             PreparedStatement getCharNamesStmt = conn.prepareStatement("EXEC GetPendingBonusCharNames");
             PreparedStatement getCharIdStmt = conn.prepareStatement("EXEC GetCharIdByCharName @char_name = ?");
             PreparedStatement giveBonus = conn.prepareStatement("EXEC GiveBonus @Date = ?, @char_name = ?")) {
            CacheD cacheD = new CacheD(CACHED_IP, CACHED_PORT);
            try (ResultSet rs = getCharNamesStmt.executeQuery()) {
                while (rs.next()) {
                    LocalDateTime date = LocalDateTime.parse(rs.getString(1), DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));
                    String charName = rs.getString(2);
                    getCharIdStmt.setString(1, charName);
                    try (ResultSet charIdRs = getCharIdStmt.executeQuery()) {
                        if (charIdRs.next() && charIdRs.getInt(1) != 0) {
                            int charId = charIdRs.getInt(1);
                            if (cacheD.checkCharacterPacket(charId)) {
                                cacheD.kickCharacterPacket(charId);
                                Thread.sleep(1000);
                                cacheD.addItem2Packet(charId, 0, ITEM_ID, ITEM_COUNT, 0, 0, 0, 0);
                            } else {
                                cacheD.addItem2Packet(charId, 0, ITEM_ID, ITEM_COUNT, 0, 0, 0, 0);
                            }
                        }
                    }
                    giveBonus.setString(1, date.format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
                    giveBonus.setString(2, charName);
                    giveBonus.executeUpdate();
                }
            }
            conn.commit();
        } catch (SQLException | InterruptedException e) {
            e.printStackTrace();
        }
    }
}
 
Назад
Сверху Снизу