Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
24 changes: 0 additions & 24 deletions build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -56,27 +56,3 @@ subprojects {
}
}


githubRelease {
token = project.findProperty('github.token') ?: System.getenv('GITHUB_TOKEN')
owner = 'BONNePlayground'
repo = 'TwitchSpawn'
tagName = "${project.version}-${rootProject.minecraft_version}"
targetCommitish = "architectury-${rootProject.minecraft_version}"
releaseName = "${rootProject.archives_name} for ${rootProject.minecraft_version} v${project.version}"
body = {
def changelogFile = file('CHANGELOG_LATEST.md')
if (changelogFile.exists()) {
return changelogFile.text
} else {
return "Release ${project.version}"
}
}
releaseAssets = [
files("fabric/build/libs/${rootProject.archives_name}-fabric-${rootProject.minecraft_version}-${project.version}.jar"),
files("neoforge/build/libs/${rootProject.archives_name}-neoforge-${rootProject.minecraft_version}-${project.version}.jar")
]

draft = true
prerelease = false
}
Original file line number Diff line number Diff line change
Expand Up @@ -86,8 +86,8 @@ public static void init()
});

NetworkManager.registerReceiver(NetworkManager.Side.C2S,
SyncStreamerDataPacket.ID,
SyncStreamerDataPacket.STREAM_CODEC,
SyncStreamerDataPacket.C2S.ID,
SyncStreamerDataPacket.C2S.STREAM_CODEC,
SyncStreamerDataPacket::handle);

try
Expand All @@ -112,7 +112,7 @@ public static void initServer()
NetworkManager.registerS2CPayloadType(GlobalChatCooldownPacket.ID, GlobalChatCooldownPacket.STREAM_CODEC);
NetworkManager.registerS2CPayloadType(OsRunPacket.ID, OsRunPacket.STREAM_CODEC);
NetworkManager.registerS2CPayloadType(StatusChangedPacket.ID, StatusChangedPacket.STREAM_CODEC);
NetworkManager.registerS2CPayloadType(SyncStreamerDataPacket.ID, SyncStreamerDataPacket.STREAM_CODEC);
NetworkManager.registerS2CPayloadType(SyncStreamerDataPacket.S2C.ID, SyncStreamerDataPacket.S2C.STREAM_CODEC);

// Do stuff on player joining the server.
PlayerEvent.PLAYER_JOIN.register(player ->
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -58,8 +58,8 @@ public static void init()
StatusChangedPacket::handle);

NetworkManager.registerReceiver(NetworkManager.Side.S2C,
SyncStreamerDataPacket.ID,
SyncStreamerDataPacket.STREAM_CODEC,
SyncStreamerDataPacket.S2C.ID,
SyncStreamerDataPacket.S2C.STREAM_CODEC,
SyncStreamerDataPacket::handle);
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -192,7 +192,7 @@ private void disconnect()
}
});

NetworkManager.sendToServer(new SyncStreamerDataPacket(
NetworkManager.sendToServer(new SyncStreamerDataPacket.C2S(
Minecraft.getInstance().player.getName().getString(),
"",
"",
Expand Down Expand Up @@ -365,7 +365,7 @@ private void startPolling()
private void saveTokensAndEvents(String accessToken, String refreshToken, List<String> selectedEvents)
{
// send token to server
NetworkManager.sendToServer(new SyncStreamerDataPacket(
NetworkManager.sendToServer(new SyncStreamerDataPacket.C2S(
Minecraft.getInstance().player.getName().getString(),
accessToken,
refreshToken,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -32,10 +32,7 @@
import net.programmer.igoodie.twitchspawn.tslanguage.parser.TSLTokenizer;
import net.programmer.igoodie.twitchspawn.util.MCPHelpers;

import java.util.Collection;
import java.util.Iterator;
import java.util.List;
import java.util.Set;
import java.util.*;
import java.util.stream.Stream;

public class TwitchSpawnCommand {
Expand Down Expand Up @@ -99,20 +96,19 @@ public static int authModule(CommandContext<CommandSourceStack> context)
filter(streamer -> streamer.minecraftNick.equalsIgnoreCase(player.getName().getString())).
findAny().
map(streamer ->
new SyncStreamerDataPacket(player.getName().getString(),
new SyncStreamerDataPacket.S2C(player.getName().getString(),
streamer.twitchAccessToken,
streamer.twitchRefreshToken,
streamer.twitchScopes)).
orElse(new SyncStreamerDataPacket(player.getName().getString(),
orElse(new SyncStreamerDataPacket.S2C(player.getName().getString(),
"",
"",
""));

NetworkManager.sendToPlayer(player, syncStreamerDataPacket);
}
catch (CommandSyntaxException e)
{
TwitchSpawn.LOGGER.error("AUTH is available only for players.");
catch (CommandSyntaxException e) {
TwitchSpawn.LOGGER.error("AUTH is available only for players.", e);
return 0;
}

Expand All @@ -131,8 +127,6 @@ public static int statusModule(CommandContext<CommandSourceStack> context) {

public static int startModule(CommandContext<CommandSourceStack> context) {
String sourceNickname = context.getSource().getTextName();

// If has no permission
if (!ConfigManager.CREDENTIALS.hasPermission(sourceNickname)) {
context.getSource().sendSuccess(() -> Component.translatable(
"commands.twitchspawn.start.no_perm"), true);
Expand All @@ -153,8 +147,6 @@ public static int startModule(CommandContext<CommandSourceStack> context) {

public static int stopModule(CommandContext<CommandSourceStack> context) {
String sourceNickname = context.getSource().getTextName();

// If has no permission
if (!ConfigManager.CREDENTIALS.hasPermission(sourceNickname)) {
context.getSource().sendSuccess(() -> Component.translatable(
"commands.twitchspawn.stop.no_perm"), true);
Expand All @@ -179,9 +171,8 @@ public static int reloadModule(CommandContext<CommandSourceStack> context) {

boolean isOp = TwitchSpawn.SERVER.isSingleplayer()
|| Stream.of(TwitchSpawn.SERVER.getPlayerList().getOpNames())
.anyMatch(oppedPlayerName -> oppedPlayerName.equalsIgnoreCase(sourceNickname));
.anyMatch(op -> op.equalsIgnoreCase(sourceNickname));

// If is not OP or has no permission
if (!isOp && !ConfigManager.CREDENTIALS.hasPermission(sourceNickname)) {
context.getSource().sendSuccess(() -> Component.translatable(
"commands.twitchspawn.reloadcfg.no_perm"), true);
Expand Down Expand Up @@ -260,8 +251,6 @@ public static int simulateModule(CommandContext<CommandSourceStack> context, Str
try {
String sourceName = context.getSource().getTextName();
String streamerName = streamerNick != null ? streamerNick : sourceName;

// If has no permission
if (!ConfigManager.CREDENTIALS.hasPermission(sourceName)) {
context.getSource().sendSuccess(() -> Component.translatable(
"commands.twitchspawn.simulate.no_perm"), true);
Expand Down Expand Up @@ -311,11 +300,11 @@ public static int simulateModule(CommandContext<CommandSourceStack> context, Str
ConfigManager.RULESET_COLLECTION.handleEvent(simulatedEvent);

context.getSource().sendSuccess(() -> Component.translatable(
"commands.twitchspawn.simulate.success", nbt), true);
"commands.twitchspawn.simulate.success", nbt.toString()), true);

return 1;
} catch (Exception e) {
e.printStackTrace();
TwitchSpawn.LOGGER.error("Caught exception while simulating event", e);
return 0;
}
}
Expand All @@ -325,7 +314,7 @@ public static int executeModule(CommandContext<CommandSourceStack> context) thro
String words = TSLWordsArgumentType.getWords(context, "tsl_action");

List<String> wordTokens = TSLTokenizer.intoWords(words);
String actionName = wordTokens.remove(0);
String actionName = wordTokens.removeFirst();

TSLAction tslAction = TSLParser.parseAction(actionName, wordTokens);
EventArguments eventArguments = EventArguments.createRandom(context.getSource().getTextName());
Expand Down Expand Up @@ -361,7 +350,7 @@ public static int testModule(CommandContext<CommandSourceStack> context, String
while (eventIterator.hasNext()) {
event = eventIterator.next();

TSLEventPair eventPair = TSLEventKeyword.toPairs(event.getName()).iterator().next();
TSLEventPair eventPair = Objects.requireNonNull(TSLEventKeyword.toPairs(event.getName())).iterator().next();
EventArguments eventArguments = new EventArguments(eventPair);
eventArguments.randomize();
eventArguments.streamerNickname = streamerPlayer.getName().getString();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,10 +3,10 @@
// Copyright - 2025
//


package net.programmer.igoodie.twitchspawn.network.packet;


import com.mojang.datafixers.util.Function4;
import org.jetbrains.annotations.NotNull;

import dev.architectury.networking.NetworkManager;
Expand All @@ -24,11 +24,16 @@
import net.programmer.igoodie.twitchspawn.configuration.CredentialsConfig;


public record SyncStreamerDataPacket(String playerName,
String twitchToken,
String twitchRefreshToken,
String subscribeScopes) implements CustomPacketPayload
{
public abstract class SyncStreamerDataPacket implements CustomPacketPayload {
protected final String playerName, twitchToken, twitchRefreshToken, subscribeScopes;

protected SyncStreamerDataPacket(String playerName, String twitchToken, String twitchRefreshToken, String subscribeScopes) {
this.playerName = playerName;
this.twitchToken = twitchToken;
this.twitchRefreshToken = twitchRefreshToken;
this.subscribeScopes = subscribeScopes;
}

public static void handle(SyncStreamerDataPacket data, NetworkManager.PacketContext packetContext)
{
packetContext.queue(() ->
Expand Down Expand Up @@ -69,24 +74,42 @@ public static void handle(SyncStreamerDataPacket data, NetworkManager.PacketCont
});
}


@Override
@NotNull
public Type<? extends CustomPacketPayload> type()
{
return SyncStreamerDataPacket.ID;
public static <T extends SyncStreamerDataPacket> StreamCodec<RegistryFriendlyByteBuf, T> streamCodec(Function4<String, String, String, String, T> constructor) {
return StreamCodec.composite(
ByteBufCodecs.STRING_UTF8, p -> p.playerName,
ByteBufCodecs.STRING_UTF8, p -> p.twitchToken,
ByteBufCodecs.STRING_UTF8, p -> p.twitchRefreshToken,
ByteBufCodecs.STRING_UTF8, p -> p.subscribeScopes,
constructor
);
}

public static class C2S extends SyncStreamerDataPacket {
public static final StreamCodec<? super RegistryFriendlyByteBuf, C2S> STREAM_CODEC = streamCodec(C2S::new);

public static final Type<SyncStreamerDataPacket> ID =
new Type<>(ResourceLocation.fromNamespaceAndPath(TwitchSpawn.MOD_ID, "sync_data_packet"));
public C2S(String playerName, String twitchToken, String twitchRefreshToken, String subscribeScopes) {
super(playerName, twitchToken, twitchRefreshToken, subscribeScopes);
}

@Override
@NotNull
public Type<? extends CustomPacketPayload> type() {
return ID;
}
public static final Type<C2S> ID = new Type<>(ResourceLocation.fromNamespaceAndPath(TwitchSpawn.MOD_ID, "serverbound_sync_data_packet"));
}

public static final StreamCodec<RegistryFriendlyByteBuf, SyncStreamerDataPacket> STREAM_CODEC = StreamCodec.composite(
ByteBufCodecs.STRING_UTF8, SyncStreamerDataPacket::playerName,
ByteBufCodecs.STRING_UTF8, SyncStreamerDataPacket::twitchToken,
ByteBufCodecs.STRING_UTF8, SyncStreamerDataPacket::twitchRefreshToken,
ByteBufCodecs.STRING_UTF8, SyncStreamerDataPacket::subscribeScopes,
SyncStreamerDataPacket::new
);
public static class S2C extends SyncStreamerDataPacket {
public static final StreamCodec<? super RegistryFriendlyByteBuf, S2C> STREAM_CODEC = streamCodec(S2C::new);
public S2C(String playerName, String twitchToken, String twitchRefreshToken, String subscribeScopes) {
super(playerName, twitchToken, twitchRefreshToken, subscribeScopes);
}

@Override
@NotNull
public Type<? extends CustomPacketPayload> type() {
return ID;
}
public static final Type<S2C> ID = new Type<>(ResourceLocation.fromNamespaceAndPath(TwitchSpawn.MOD_ID, "clientbound_sync_data_packet"));
}
}