Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- diff --git a/aCis_gameserver/java/net/sf/l2j/discord/Discord.java b/aCis_gameserver/java/net/sf/l2j/discord/Discord.java
- new file mode 100644
- index 0000000..8cf3f83
- --- /dev/null
- +++ b/aCis_gameserver/java/net/sf/l2j/discord/Discord.java
- @@ -0,0 +1,70 @@
- +package net.sf.l2j.discord;
- +
- +import java.util.Arrays;
- +import java.util.List;
- +import java.util.Set;
- +import java.util.concurrent.ConcurrentHashMap;
- +
- +import javax.security.auth.login.LoginException;
- +
- +import net.dv8tion.jda.api.JDA;
- +import net.dv8tion.jda.api.JDABuilder;
- +import net.dv8tion.jda.api.OnlineStatus;
- +import net.dv8tion.jda.api.entities.Activity;
- +import net.dv8tion.jda.api.entities.TextChannel;
- +import net.dv8tion.jda.api.entities.User;
- +import net.dv8tion.jda.api.requests.RestAction;
- +import net.sf.l2j.discord.actions.handlers.IDiscordHandler;
- +import net.sf.l2j.discord.misc.DiscordHandlers;
- +
- +/**
- + * @author Melron
- + */
- +public class Discord
- +{
- + private static final String BOT_TOKEN = ""; // Your bot token here
- + private static final Set<IDiscordHandler> HANDLERS = ConcurrentHashMap.newKeySet();
- + private static JDA _api;
- +
- + public static void init()
- + {
- + try
- + {
- + initApi();
- + Arrays.asList(DiscordHandlers.get()).forEach(HANDLERS::add);
- + }
- + catch (Exception e)
- + {
- + e.printStackTrace();
- + }
- + }
- +
- + private static void initApi() throws LoginException, InterruptedException
- + {
- + _api = JDABuilder.createDefault(BOT_TOKEN).build();
- + _api.awaitReady();
- + _api.getPresence().setStatus(OnlineStatus.IDLE);
- + _api.getPresence().setActivity(Activity.playing("L][Melron"));
- + }
- +
- + public static <T> void notify(Class<T> handlerClass, Object... params)
- + {
- + getAssignedHandlers(handlerClass).forEach(handler -> handler.notify(params));
- + }
- +
- + private static <T> List<IDiscordHandler> getAssignedHandlers(Class<T> handlerClass)
- + {
- + return HANDLERS.stream().filter(handler -> handlerClass.isAssignableFrom(handler.getClass())).toList();
- + }
- +
- + public static TextChannel getChannel(String channelName)
- + {
- + return _api.getTextChannelsByName(channelName, true).get(0);
- + }
- +
- + public static RestAction<User> getUser(long id)
- + {
- + return _api.retrieveUserById(id);
- + }
- +}
- diff --git a/aCis_gameserver/java/net/sf/l2j/discord/actions/handlers/ChannelMessage.java b/aCis_gameserver/java/net/sf/l2j/discord/actions/handlers/ChannelMessage.java
- new file mode 100644
- index 0000000..4670955
- --- /dev/null
- +++ b/aCis_gameserver/java/net/sf/l2j/discord/actions/handlers/ChannelMessage.java
- @@ -0,0 +1,47 @@
- +package net.sf.l2j.discord.actions.handlers;
- +
- +import java.util.Arrays;
- +import java.util.List;
- +
- +import net.dv8tion.jda.api.entities.MessageEmbed;
- +import net.dv8tion.jda.api.entities.TextChannel;
- +import net.sf.l2j.gameserver.enums.SayType;
- +import net.sf.l2j.gameserver.model.actor.Player;
- +
- +/**
- + * @author Melron
- + */
- +public class ChannelMessage implements IDiscordHandler
- +{
- + private static final List<String> prefixes = Arrays.asList("wtb", "wtt", "wts", "wtc");
- +
- + @Override
- + public void notify(Object... params)
- + {
- + if (params[0] instanceof MessageEmbed)
- + {
- + sendEmbedMessage(params);
- + return;
- + }
- +
- + final SayType type = (SayType) params[0];
- + final Player player = (Player) params[1];
- + final String message = (String) params[2];
- + final boolean isDiscordLegend = player.isDiscordLegend();
- +
- + if (prefixes.stream().anyMatch(message.toLowerCase()::startsWith))
- + sendMessage(type, String.format("[%s]: %s %s", player.getName(), isDiscordLegend ? "@everyone " : "", message));
- + }
- +
- + private static void sendEmbedMessage(Object... params)
- + {
- + final MessageEmbed message = (MessageEmbed) params[0];
- + final TextChannel channel = (TextChannel) params[1];
- + channel.sendMessageEmbeds(message).queue();
- + }
- +
- + private void sendMessage(SayType channel, String message)
- + {
- + getChannel(channel.name().toLowerCase()).sendMessage(message).queue();
- + }
- +}
- \ No newline at end of file
- diff --git a/aCis_gameserver/java/net/sf/l2j/discord/actions/handlers/GrandBossDeath.java b/aCis_gameserver/java/net/sf/l2j/discord/actions/handlers/GrandBossDeath.java
- new file mode 100644
- index 0000000..9a6c3c5
- --- /dev/null
- +++ b/aCis_gameserver/java/net/sf/l2j/discord/actions/handlers/GrandBossDeath.java
- @@ -0,0 +1,92 @@
- +package net.sf.l2j.discord.actions.handlers;
- +
- +import java.util.Arrays;
- +import java.util.concurrent.TimeUnit;
- +
- +import net.sf.l2j.commons.data.StatSet;
- +
- +import net.dv8tion.jda.api.EmbedBuilder;
- +import net.dv8tion.jda.api.entities.MessageEmbed;
- +import net.sf.l2j.gameserver.data.manager.GrandBossManager;
- +import net.sf.l2j.gameserver.model.actor.Player;
- +import net.sf.l2j.gameserver.model.actor.instance.Monster;
- +
- +/**
- + * @author Melron
- + */
- +public class GrandBossDeath implements IDiscordHandler
- +{
- + @Override
- + public void notify(Object... params)
- + {
- + final Player killer = (Player) params[0];
- + final Monster boss = (Monster) params[1];
- + final ImageContent image = ImageContent.get(boss.getNpcId());
- + final MessageEmbed message = createBuilder(killer, boss, image);
- + sendMessage(message, getChannel("raid-died"));
- + }
- +
- + private static MessageEmbed createBuilder(Player killer, Monster monster, ImageContent image)
- + {
- + final EmbedBuilder builder = new EmbedBuilder();
- + final StatSet info = GrandBossManager.getInstance().getStatSet(monster.getNpcId());
- + builder.setColor(0x99ccff);
- + builder.setAuthor("Lineage][Melron", image.getPng()[0], image.getPng()[0]);
- + builder.setTitle(String.format(":skull: *%s* has died! :skull:\n\n:mechanical_arm: Level ***%s***", monster.getName(), monster.getTemplate().getLevel()), "");
- + builder.addField(":clock7: Respawn Time :clock3:", getIntervalTime(info.getLong("respawn_time") - System.currentTimeMillis()), false);
- + builder.setImage(image.getPng()[1]);
- + builder.setThumbnail(image.getGif());
- + builder.setFooter(String.format("Last Hit: %s\nClan: %s", killer.getName(), killer.getClan() != null ? killer.getClan().getName() : "N/A"));
- + return builder.build();
- + }
- +
- + public static String getIntervalTime(long longInterval)
- + {
- + long intMillis = longInterval;
- + final long dd = TimeUnit.MILLISECONDS.toDays(intMillis);
- + intMillis -= TimeUnit.DAYS.toMillis(dd);
- + final long hh = TimeUnit.MILLISECONDS.toHours(intMillis);
- + intMillis -= TimeUnit.HOURS.toMillis(hh);
- + final long mm = TimeUnit.MILLISECONDS.toMinutes(intMillis);
- + intMillis -= TimeUnit.MINUTES.toMillis(mm);
- + final long ss = TimeUnit.MILLISECONDS.toSeconds(intMillis);
- + intMillis -= TimeUnit.SECONDS.toMillis(ss);
- +
- + final String stringInterval = "Days:%d, Hours:%d, Minutes:%d, Seconds:%d";
- + return String.format("```re\n" + stringInterval + "```", dd, hh, mm, ss);
- + }
- +
- + enum ImageContent
- + {
- + dummy(0, "https://j.gifs.com/y5PglQ.gif", "https://i.ibb.co/pQzBsVQ/1.png", "https://i.ibb.co/jLt1Q7w/Mob-29020.jpg"),
- + Baium(29020, "https://j.gifs.com/y5PglQ.gif", "https://i.ibb.co/pQzBsVQ/1.png", "https://i.ibb.co/jLt1Q7w/Mob-29020.jpg");
- +
- + private final String[] _png;
- + private final String _gif;
- + private final int _id;
- +
- + ImageContent(int id_, String gif_, String... png_)
- + {
- + _id = id_;
- + _png = png_;
- + _gif = gif_;
- + }
- +
- + public String[] getPng()
- + {
- + return _png;
- + }
- +
- + public String getGif()
- + {
- + return _gif;
- + }
- +
- + public static ImageContent get(int npcId)
- + {
- + return Arrays.stream(VALUES).filter(i -> i._id == npcId).findFirst().orElse(dummy);
- + }
- +
- + public static final ImageContent[] VALUES = values();
- + }
- +}
- diff --git a/aCis_gameserver/java/net/sf/l2j/discord/actions/handlers/IDiscordHandler.java b/aCis_gameserver/java/net/sf/l2j/discord/actions/handlers/IDiscordHandler.java
- new file mode 100644
- index 0000000..6976b19
- --- /dev/null
- +++ b/aCis_gameserver/java/net/sf/l2j/discord/actions/handlers/IDiscordHandler.java
- @@ -0,0 +1,35 @@
- +package net.sf.l2j.discord.actions.handlers;
- +
- +import net.dv8tion.jda.api.entities.MessageEmbed;
- +import net.dv8tion.jda.api.entities.TextChannel;
- +import net.dv8tion.jda.api.entities.User;
- +import net.dv8tion.jda.api.requests.RestAction;
- +import net.sf.l2j.discord.Discord;
- +
- +/**
- + * @author Melron
- + */
- +public interface IDiscordHandler
- +{
- + public abstract void notify(Object... params);
- +
- + default void sendMessage(String message, long userId)
- + {
- + Discord.notify(PrivateMessage.class, userId, message);
- + }
- +
- + default void sendMessage(MessageEmbed message, TextChannel channel)
- + {
- + Discord.notify(ChannelMessage.class, message, channel);
- + }
- +
- + default TextChannel getChannel(String channelName)
- + {
- + return Discord.getChannel(channelName);
- + }
- +
- + default RestAction<User> getUser(long id)
- + {
- + return Discord.getUser(id);
- + }
- +}
- diff --git a/aCis_gameserver/java/net/sf/l2j/discord/actions/handlers/Login.java b/aCis_gameserver/java/net/sf/l2j/discord/actions/handlers/Login.java
- new file mode 100644
- index 0000000..d667d6e
- --- /dev/null
- +++ b/aCis_gameserver/java/net/sf/l2j/discord/actions/handlers/Login.java
- @@ -0,0 +1,34 @@
- +package net.sf.l2j.discord.actions.handlers;
- +
- +import java.util.stream.Collectors;
- +
- +import net.sf.l2j.gameserver.model.World;
- +import net.sf.l2j.gameserver.model.actor.Player;
- +
- +/**
- + * @author Melron
- + */
- +public class Login implements IDiscordHandler
- +{
- + private static final String message = "Login activity!```ini\n[IP: %s]\n[Character: %s]\n[Players with same IP: %s]```";
- +
- + @Override
- + public void notify(Object... params)
- + {
- + final Player player = (Player) params[0];
- + final String ip = player.getIp();
- + final String sameIpPlayers = World.getInstance()
- + .getPlayers()
- + .stream()
- + .filter(p -> p.getIp().equals(ip))
- + .map(Player::getName)
- + .collect(Collectors.joining(","));
- +
- + sendMessage(createMessage(player.getName(), ip, sameIpPlayers), player.getDiscordID());
- + }
- +
- + private static String createMessage(String playerName, String ip, String sameIpPlayers)
- + {
- + return String.format(message, ip, playerName, sameIpPlayers);
- + }
- +}
- \ No newline at end of file
- diff --git a/aCis_gameserver/java/net/sf/l2j/discord/actions/handlers/PrivateMessage.java b/aCis_gameserver/java/net/sf/l2j/discord/actions/handlers/PrivateMessage.java
- new file mode 100644
- index 0000000..e1bc0ec
- --- /dev/null
- +++ b/aCis_gameserver/java/net/sf/l2j/discord/actions/handlers/PrivateMessage.java
- @@ -0,0 +1,27 @@
- +package net.sf.l2j.discord.actions.handlers;
- +
- +import net.dv8tion.jda.api.entities.User;
- +import net.dv8tion.jda.api.requests.RestAction;
- +
- +/**
- + * @author Melron
- + */
- +public class PrivateMessage implements IDiscordHandler
- +{
- + @Override
- + public void notify(Object... params)
- + {
- + final long discordMemberId = (long) params[0];
- + final String message = (String) params[1];
- + sendPrivateMessage(discordMemberId, message);
- + }
- +
- + private void sendPrivateMessage(long id, String message)
- + {
- + final RestAction<User> user = getUser(id);
- + if (user == null)
- + return;
- +
- + user.queue(discordMember -> discordMember.openPrivateChannel().queue((channel) -> channel.sendMessage(message).queue()));
- + }
- +}
- diff --git a/aCis_gameserver/java/net/sf/l2j/discord/misc/DiscordHandlers.java b/aCis_gameserver/java/net/sf/l2j/discord/misc/DiscordHandlers.java
- new file mode 100644
- index 0000000..53ad8d7
- --- /dev/null
- +++ b/aCis_gameserver/java/net/sf/l2j/discord/misc/DiscordHandlers.java
- @@ -0,0 +1,23 @@
- +package net.sf.l2j.discord.misc;
- +
- +import net.sf.l2j.discord.actions.handlers.*;
- +
- +/**
- + * @author Melron
- + */
- +public class DiscordHandlers
- +{
- + private static final IDiscordHandler[] listeners = new IDiscordHandler[]
- + {
- + new Login(),
- + new ChannelMessage(),
- + new PrivateMessage(),
- + new GrandBossDeath(),
- + };
- +
- + public static IDiscordHandler[] get()
- + {
- + return listeners;
- + }
- +}
- diff --git a/aCis_gameserver/java/net/sf/l2j/gameserver/GameServer.java b/aCis_gameserver/java/net/sf/l2j/gameserver/GameServer.java
- index e682cc6..2929c44 100644
- --- a/aCis_gameserver/java/net/sf/l2j/gameserver/GameServer.java
- +++ b/aCis_gameserver/java/net/sf/l2j/gameserver/GameServer.java
- @@ -15,7 +15,9 @@
- import net.sf.l2j.commons.util.SysUtil;
- import net.sf.l2j.Config;
- +import net.sf.l2j.discord.Discord;
- import net.sf.l2j.gameserver.communitybbs.CommunityBoard;
- import net.sf.l2j.gameserver.data.SkillTable;
- import net.sf.l2j.gameserver.data.cache.CrestCache;
- import net.sf.l2j.gameserver.data.cache.HtmCache;
- @@ -89,6 +91,7 @@
- + StringUtil.printSection("Discord");
- + Discord.init();
- +
- if (Config.ALLOW_WEDDING)
- CoupleManager.getInstance();
- diff --git a/aCis_gameserver/java/net/sf/l2j/gameserver/handler/chathandlers/ChatShout.java b/aCis_gameserver/java/net/sf/l2j/gameserver/handler/chathandlers/ChatShout.java
- index e49d572..115c7f6 100644
- --- a/aCis_gameserver/java/net/sf/l2j/gameserver/handler/chathandlers/ChatShout.java
- +++ b/aCis_gameserver/java/net/sf/l2j/gameserver/handler/chathandlers/ChatShout.java
- @@ -1,5 +1,7 @@
- package net.sf.l2j.gameserver.handler.chathandlers;
- +import net.sf.l2j.discord.Discord;
- +import net.sf.l2j.discord.actions.handlers.ChannelMessage;
- import net.sf.l2j.gameserver.data.xml.MapRegionData;
- import net.sf.l2j.gameserver.enums.FloodProtector;
- import net.sf.l2j.gameserver.enums.SayType;
- @@ -29,6 +31,8 @@
- if (region == MapRegionData.getInstance().getMapRegion(worldPlayer.getX(), worldPlayer.getY()))
- worldPlayer.sendPacket(cs);
- }
- +
- + Discord.notify(ChannelMessage.class, COMMAND_IDS[0], player, text);
- }
- @Override
- diff --git a/aCis_gameserver/java/net/sf/l2j/gameserver/handler/chathandlers/ChatTrade.java b/aCis_gameserver/java/net/sf/l2j/gameserver/handler/chathandlers/ChatTrade.java
- index 6945b99..a8a62f2 100644
- --- a/aCis_gameserver/java/net/sf/l2j/gameserver/handler/chathandlers/ChatTrade.java
- +++ b/aCis_gameserver/java/net/sf/l2j/gameserver/handler/chathandlers/ChatTrade.java
- @@ -1,5 +1,7 @@
- package net.sf.l2j.gameserver.handler.chathandlers;
- +import net.sf.l2j.discord.Discord;
- +import net.sf.l2j.discord.actions.handlers.ChannelMessage;
- import net.sf.l2j.gameserver.data.xml.MapRegionData;
- import net.sf.l2j.gameserver.enums.FloodProtector;
- import net.sf.l2j.gameserver.enums.SayType;
- @@ -29,6 +31,8 @@
- if (region == MapRegionData.getInstance().getMapRegion(worldPlayer.getX(), worldPlayer.getY()))
- worldPlayer.sendPacket(cs);
- }
- +
- + Discord.notify(ChannelMessage.class, COMMAND_IDS[0], player, text);
- }
- @Override
- diff --git a/aCis_gameserver/java/net/sf/l2j/gameserver/model/actor/Player.java b/aCis_gameserver/java/net/sf/l2j/gameserver/model/actor/Player.java
- index 647ec10..6b6c6b4 100644
- --- a/aCis_gameserver/java/net/sf/l2j/gameserver/model/actor/Player.java
- +++ b/aCis_gameserver/java/net/sf/l2j/gameserver/model/actor/Player.java
- @@ -3185,6 +3185,11 @@
- sendPacket(new TradeStart(this));
- }
- + public boolean sendDiscordNotifications()
- + {
- + return isGM(); // Change it to your condition like isDonator
- + }
- +
- public void onTradeConfirm(Player partner)
- {
- sendPacket(SystemMessage.getSystemMessage(SystemMessageId.S1_CONFIRMED_TRADE).addString(partner.getName()));
- @@ -3221,6 +3227,11 @@
- }
- }
- + public static long getDiscordID()
- + {
- + return 0L;
- + }
- +
- public void startTrade(Player partner)
- {
- onTradeStart(partner);
- @@ -7368,6 +7384,16 @@
- }
- }
- + public boolean isDiscordLegend()
- + {
- + return true;
- + }
- +
- + public String getIp()
- + {
- + return getClient().getConnection().getInetAddress().getHostAddress();
- + }
- +
- /**
- * Added to other GMs, test also this {@link Player} instance. If GM, set it.
- */
- diff --git a/aCis_gameserver/java/net/sf/l2j/gameserver/model/actor/instance/GrandBoss.java b/aCis_gameserver/java/net/sf/l2j/gameserver/model/actor/instance/GrandBoss.java
- index ca72456..974c662 100644
- --- a/aCis_gameserver/java/net/sf/l2j/gameserver/model/actor/instance/GrandBoss.java
- +++ b/aCis_gameserver/java/net/sf/l2j/gameserver/model/actor/instance/GrandBoss.java
- @@ -2,6 +2,8 @@
- import net.sf.l2j.commons.random.Rnd;
- +import net.sf.l2j.discord.Discord;
- +import net.sf.l2j.discord.actions.handlers.GrandBossDeath;
- import net.sf.l2j.gameserver.data.manager.HeroManager;
- import net.sf.l2j.gameserver.data.manager.RaidPointManager;
- import net.sf.l2j.gameserver.model.actor.Creature;
- @@ -61,7 +63,7 @@
- HeroManager.getInstance().setRBkilled(player.getObjectId(), getNpcId());
- }
- }
- -
- + Discord.notify(GrandBossDeath.class, player, this);
- return true;
- }
- diff --git a/aCis_gameserver/java/net/sf/l2j/gameserver/network/clientpackets/EnterWorld.java b/aCis_gameserver/java/net/sf/l2j/gameserver/network/clientpackets/EnterWorld.java
- index 4eab799..30db3c5 100644
- --- a/aCis_gameserver/java/net/sf/l2j/gameserver/network/clientpackets/EnterWorld.java
- +++ b/aCis_gameserver/java/net/sf/l2j/gameserver/network/clientpackets/EnterWorld.java
- @@ -3,6 +3,8 @@
- import java.util.Map.Entry;
- import net.sf.l2j.Config;
- +import net.sf.l2j.discord.Discord;
- +import net.sf.l2j.discord.actions.handlers.Login;
- import net.sf.l2j.gameserver.communitybbs.manager.MailBBSManager;
- import net.sf.l2j.gameserver.data.SkillTable.FrequentSkill;
- import net.sf.l2j.gameserver.data.manager.CastleManager;
- @@ -289,6 +291,9 @@
- if (qs != null)
- qs.getQuest().notifyEvent("UC", null, player);
- + if (player.sendDiscordNotifications())
- + Discord.notify(Login.class, player);
- +
- player.sendPacket(ActionFailed.STATIC_PACKET);
- }
Add Comment
Please, Sign In to add comment