Skip to content
This repository was archived by the owner on Apr 11, 2021. It is now read-only.

Commit c6b6c26

Browse files
authored
Merge pull request #27 from GlitchLib/dev
Release v0.4.0
2 parents 7e09934 + 21f21a4 commit c6b6c26

File tree

96 files changed

+2503
-135
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

96 files changed

+2503
-135
lines changed

BOM/build.gradle

Lines changed: 8 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
plugins {
2-
id "ru.vyarus.pom" version "1.3.0"
2+
id "io.spring.dependency-management" version "1.0.6.RELEASE"
33
}
44

55
description = "Bills of Materials (BOM) for Glitch packages"
@@ -12,17 +12,13 @@ tasks.withType(Jar) {
1212
delombok.enabled = false
1313
test.enabled = false
1414

15-
withPomXml { Node node ->
16-
node.appendNode("name").value = "Glitch BOM"
17-
node.remove(node.dependencyManagement) // removes Project Reactor form dependency management
18-
Node deps = node.appendNode("dependencyManagement").appendNode("dependencies")
19-
20-
project.rootProject.subprojects.each {
21-
if (it.name != "BOM" && it.name != "docs") {
22-
Node dep = deps.appendNode('dependency')
23-
dep.appendNode('groupId', it.group)
24-
dep.appendNode('artifactId', it.archivesBaseName)
25-
dep.appendNode('version', it.version)
15+
dependencyManagement {
16+
dependencies {
17+
rootProject.subprojects.each {
18+
if (it.name != "BOM" && it.name != "docs") {
19+
dependency(group: it.group, name: it.archivesBaseName, version: it.version)
20+
}
2621
}
2722
}
2823
}
24+

chat/src/main/java/glitch/chat/Configuration.java

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -31,11 +31,6 @@ public class Configuration {
3131
// });
3232
}
3333

34-
// TODO: Kraken API
35-
// public Mono<GlobalUserState> getBotGlobalUserState() {
36-
// return chat.getApi().getGlobalUserState(botCredentials);
37-
// }
38-
3934
public Mono<Long> getChatLimits(boolean moderator) {
4035
return Mono.delay(rateLimits.getChatDuration(moderator));
4136
}

chat/src/main/java/glitch/chat/GlitchChat.java

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -127,7 +127,10 @@ private void compose() {
127127
}
128128

129129
private void doWhisperRateLimit() {
130-
configuration.getWhisperLimits().subscribe(limit -> this.whispers = CacheBuilder.newBuilder().maximumSize(limit.getT2()).expireAfterWrite(Duration.ofMillis(limit.getT1())).build());
130+
configuration.getWhisperLimits()
131+
.subscribe(limit -> this.whispers = CacheBuilder.newBuilder()
132+
.maximumSize(limit.getT2())
133+
.expireAfterWrite(Duration.ofMillis(limit.getT1())).build());
131134
}
132135

133136
private Mono<ChannelEntity> getChannel(String name, boolean join) {

chat/src/main/java/glitch/chat/IrcConverter.java

Lines changed: 80 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -2,10 +2,9 @@
22

33
import glitch.api.ws.Converter;
44
import glitch.api.ws.events.IEvent;
5-
import glitch.chat.events.ChannelMessageEvent;
6-
import glitch.chat.events.JoinUserChannelEvent;
7-
import glitch.chat.events.PartUserChannelEvent;
8-
import glitch.chat.events.RawIrcEvent;
5+
import glitch.api.ws.events.PingEvent;
6+
import glitch.api.ws.events.PongEvent;
7+
import glitch.chat.events.*;
98
import glitch.chat.object.irc.Command;
109
import glitch.chat.object.irc.Message;
1110
import glitch.chat.object.irc.Prefix;
@@ -30,42 +29,45 @@ private Message toMessage(String raw) {
3029
return toMessage(l);
3130
}
3231
}
33-
32+
String[] splitRawMsg = Arrays.copyOf(raw.split(" :", 3), 3);
3433
Message.Builder rawMsg = Message.builder().rawMessage(raw);
3534

36-
boolean trailingLocked = false;
35+
if (splitRawMsg[0].startsWith("@")) {
36+
String rawTag = splitRawMsg[0].substring(1, splitRawMsg[0].indexOf(" "));
37+
Map<String, String> tags = new LinkedHashMap<>();
38+
Arrays.stream(rawTag.split(";"))
39+
.map(tag -> Arrays.copyOf(tag.split("=", 2), 2))
40+
.map(entry -> new AbstractMap.SimpleImmutableEntry<>(entry[0], entry[1]))
41+
.forEach(tag -> {
42+
String value = tag.getValue();
43+
if (value.contains("\\r")) value = value.replace("\\r", "\r");
44+
if (value.contains("\\n")) value = value.replace("\\n", "\n");
45+
if (value.contains("\\\\")) value = value.replace("\\\\", "\\");
46+
if (value.contains("\\s")) value = value.replace("\\s", " ");
47+
if (value.contains("\\:")) value = value.replace("\\:", ":");
3748

38-
for (String part : raw.split(" ")) {
39-
if (part.startsWith("@") && !trailingLocked) {
40-
Map<String, String> tags = new LinkedHashMap<>();
41-
Arrays.stream(part.substring(1).split(";"))
42-
.map(tag -> tag.split("=", 2))
43-
.map(entry -> new AbstractMap.SimpleImmutableEntry<>(entry[0], entry[1]))
44-
.forEach(tag -> {
45-
String value = tag.getValue();
46-
if (value.contains("\\r")) value = value.replace("\\r", "\r");
47-
if (value.contains("\\n")) value = value.replace("\\n", "\n");
48-
if (value.contains("\\\\")) value = value.replace("\\\\", "\\");
49-
if (value.contains("\\s")) value = value.replace("\\s", " ");
50-
if (value.contains("\\:")) value = value.replace("\\:", ":");
49+
if (tag.getKey() != null && !tag.getKey().equals("")) {
50+
tags.put(tag.getKey(), value);
51+
}
52+
});
53+
rawMsg.tags(Tags.of(tags));
5154

52-
if (tag.getKey() != null && !tag.getKey().equals("")) {
53-
tags.put(tag.getKey(), value);
54-
}
55-
});
56-
rawMsg.tags(Tags.of(tags));
57-
} else if (part.startsWith(":")) {
58-
if (part.matches("^:(.+)(!.+)*?(@.+)*?$")) {
59-
rawMsg.prefix(Prefix.fromRaw(part));
60-
} else {
61-
trailingLocked = true;
62-
rawMsg.trailing(raw.substring(raw.indexOf(part) + 1));
63-
}
55+
splitRawMsg[0] = splitRawMsg[1].trim();
56+
57+
if (splitRawMsg.length > 2) {
58+
splitRawMsg[1] = splitRawMsg[2].trim();
59+
}
60+
}
61+
62+
rawMsg.trailing(splitRawMsg[1]);
63+
64+
for (String part : splitRawMsg[0].split(" ", 3)) {
65+
if (part.matches("^(.+)(!.+)*?(@.+)*?$")) {
66+
rawMsg.prefix(Prefix.fromRaw(part));
6467
} else if (part.matches("^([A-Z]+|[0-9]{1,3})")) {
6568
rawMsg.command(Command.of(part));
6669
} else {
67-
if (!trailingLocked)
68-
rawMsg.middle(part);
70+
rawMsg.middle(Arrays.asList(part.split(" ")));
6971
}
7072
}
7173

@@ -80,7 +82,51 @@ private IEvent<GlitchChat> doConvert(Message message, GlitchChat chat) {
8082
return new PartUserChannelEvent(chat, message);
8183
case PRIV_MSG:
8284
return new ChannelMessageEvent(chat, message);
83-
case UNKNOWN:
85+
case CLEAR_CHAT:
86+
if (message.getTrailing() != null) {
87+
if (message.getTags().containsKey("ban-duration")) {
88+
return new ChannelTimeoutEvent(chat, message);
89+
} else {
90+
return new ChannelBanEvent(chat, message);
91+
}
92+
} else {
93+
return new ChannelClearChatEvent(chat, message);
94+
}
95+
case CLEAR_MESSAGE:
96+
return new ChannelDeleteMessageEvent(chat, message);
97+
case PING:
98+
return new PingEvent<>(chat);
99+
case PONG:
100+
return new PongEvent<>(chat);
101+
case GLOBAL_USER_STATE:
102+
return new GlobalUserStateEvent(chat, message);
103+
case NOTICE:
104+
return new ChannelNoticeEvent(chat, message);
105+
case ROOM_STATE:
106+
if (message.getTags().size() > 1) {
107+
return new ChannelStateEvent(chat, message);
108+
} else {
109+
return new ChannelStateChangedEvent(chat, message);
110+
}
111+
case USER_NOTICE:
112+
return doUserNotice(chat, message);
113+
case USER_STATE:
114+
return new ChannelUserStateEvent(chat, message);
115+
default:
116+
return new RawIrcEvent(chat, message);
117+
}
118+
}
119+
120+
private IEvent<GlitchChat> doUserNotice(GlitchChat chat, Message message) {
121+
switch (message.getTags().get("msg-id")) {
122+
case "sub":
123+
return new ChannelSubscriptionEvent(chat, message);
124+
case "resub":
125+
return new ChannelResubEvent(chat, message);
126+
case "raid":
127+
return new ChannelRaidEvent(chat, message);
128+
case "ritual":
129+
return new ChannelNewChatterEvent(chat, message);
84130
default:
85131
return new RawIrcEvent(chat, message);
86132
}
Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
package glitch.chat.events;
2+
3+
import glitch.api.ws.events.AbstractEvent;
4+
import glitch.api.ws.events.IEvent;
5+
import glitch.chat.GlitchChat;
6+
import glitch.chat.object.entities.ChannelEntity;
7+
import glitch.chat.object.entities.ChannelUserEntity;
8+
import glitch.chat.object.irc.Message;
9+
import lombok.Data;
10+
import lombok.EqualsAndHashCode;
11+
import reactor.core.publisher.Mono;
12+
13+
import java.util.Optional;
14+
15+
@Data
16+
@EqualsAndHashCode(callSuper = true)
17+
public class ChannelBanEvent extends AbstractEvent<GlitchChat> implements IEvent<GlitchChat> {
18+
private final Mono<ChannelUserEntity> user;
19+
private final Mono<ChannelEntity> channel;
20+
private final Optional<String> reason;
21+
22+
public ChannelBanEvent(GlitchChat client, Message message) {
23+
super(client);
24+
this.channel = client.getChannel(message.getMiddle().get(0).substring(1));
25+
this.user = this.channel.flatMap(c -> c.getUser(message.getTrailing()));
26+
this.reason = Optional.ofNullable(message.getTags().getOrDefault("ban-reason", null));
27+
}
28+
}
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
package glitch.chat.events;
2+
3+
import glitch.api.ws.events.IEvent;
4+
import glitch.chat.GlitchChat;
5+
import glitch.chat.object.irc.Message;
6+
import lombok.Data;
7+
import lombok.EqualsAndHashCode;
8+
9+
@Data
10+
@EqualsAndHashCode(callSuper = true)
11+
public class ChannelBitsMessageEvent extends ChannelMessageEvent implements IEvent<GlitchChat> {
12+
private final int bits;
13+
14+
public ChannelBitsMessageEvent(GlitchChat client, Message message) {
15+
super(client, message);
16+
this.bits = message.getTags().getInteger("bits");
17+
}
18+
}
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
package glitch.chat.events;
2+
3+
import glitch.api.ws.events.AbstractEvent;
4+
import glitch.api.ws.events.IEvent;
5+
import glitch.chat.GlitchChat;
6+
import glitch.chat.object.entities.ChannelEntity;
7+
import glitch.chat.object.irc.Message;
8+
import lombok.Data;
9+
import lombok.EqualsAndHashCode;
10+
import reactor.core.publisher.Mono;
11+
12+
@Data
13+
@EqualsAndHashCode(callSuper = true)
14+
public class ChannelClearChatEvent extends AbstractEvent<GlitchChat> implements IEvent<GlitchChat> {
15+
private final Mono<ChannelEntity> channel;
16+
17+
public ChannelClearChatEvent(GlitchChat client, Message message) {
18+
super(client);
19+
this.channel = client.getChannel(message.getMiddle().get(0).substring(1));
20+
}
21+
}
Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
package glitch.chat.events;
2+
3+
import glitch.api.ws.events.AbstractEvent;
4+
import glitch.api.ws.events.IEvent;
5+
import glitch.chat.GlitchChat;
6+
import glitch.chat.object.entities.ChannelEntity;
7+
import glitch.chat.object.entities.ChannelUserEntity;
8+
import glitch.chat.object.irc.Message;
9+
import lombok.Data;
10+
import lombok.EqualsAndHashCode;
11+
import reactor.core.publisher.Mono;
12+
13+
@Data
14+
@EqualsAndHashCode(callSuper = true)
15+
public class ChannelDeleteMessageEvent extends AbstractEvent<GlitchChat> implements IEvent<GlitchChat> {
16+
private final Mono<ChannelEntity> channel;
17+
private final Mono<ChannelUserEntity> user;
18+
private final String message;
19+
private final String targetId;
20+
private final boolean actionMessage;
21+
22+
public ChannelDeleteMessageEvent(GlitchChat client, Message message) {
23+
super(client);
24+
this.channel = client.getChannel(message.getMiddle().get(0).substring(1));
25+
this.user = this.channel.flatMap(c -> c.getUser(message.getTags().get("login")));
26+
this.message = message.getFormattedTrailing();
27+
this.targetId = message.getTags().get("target-msg-id");
28+
this.actionMessage = message.isActionMessage();
29+
}
30+
}
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
package glitch.chat.events;
2+
3+
import glitch.api.ws.events.AbstractEvent;
4+
import glitch.api.ws.events.IEvent;
5+
import glitch.chat.GlitchChat;
6+
import glitch.chat.object.entities.ChannelEntity;
7+
import glitch.chat.object.entities.UserEntity;
8+
import glitch.chat.object.irc.Message;
9+
import lombok.Data;
10+
import lombok.EqualsAndHashCode;
11+
import reactor.core.publisher.Mono;
12+
13+
@Data
14+
@EqualsAndHashCode(callSuper = true)
15+
public class ChannelHostEvent extends AbstractEvent<GlitchChat> implements IEvent<GlitchChat> {
16+
private final Mono<ChannelEntity> channel;
17+
private final Mono<UserEntity> hostedChannel;
18+
private final int numberOfViews;
19+
20+
public ChannelHostEvent(GlitchChat client, Message message) {
21+
super(client);
22+
this.channel = client.getChannel(message.getMiddle().get(0).substring(1));
23+
this.hostedChannel = client.getUser(message.getMiddle().get(1));
24+
this.numberOfViews = Integer.parseInt(message.getMiddle().get(2));
25+
}
26+
}

chat/src/main/java/glitch/chat/events/ChannelMessageEvent.java

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
import com.google.common.collect.ImmutableSet;
44
import glitch.api.objects.json.Badge;
5+
import glitch.api.objects.json.interfaces.IDObject;
56
import glitch.api.ws.events.AbstractEvent;
67
import glitch.api.ws.events.IEvent;
78
import glitch.chat.GlitchChat;
@@ -14,17 +15,25 @@
1415

1516
@Data
1617
@EqualsAndHashCode(callSuper = true)
17-
public class ChannelMessageEvent extends AbstractEvent<GlitchChat> implements IEvent<GlitchChat> {
18+
public class ChannelMessageEvent extends AbstractEvent<GlitchChat> implements IEvent<GlitchChat>, IDObject<String> {
1819
private final Mono<ChannelEntity> channel;
1920
private final Mono<ChannelUserEntity> user;
2021
private final String content;
2122
private final ImmutableSet<Badge> badges;
23+
private final boolean actionMessage;
24+
private final String id;
2225

2326
public ChannelMessageEvent(GlitchChat client, Message message) {
2427
super(client, message.getTags().getSentTimestamp());
25-
this.content = message.getTrailing();
28+
this.content = message.getFormattedTrailing();
2629
this.channel = client.getChannel(message.getMiddle().get(0).substring(1));
2730
this.badges = message.getTags().getBadges();
2831
this.user = this.channel.map(c -> new ChannelUserEntity(c, message.getPrefix().getNick(), badges));
32+
this.actionMessage = message.isActionMessage();
33+
this.id = message.getTags().get("id");
34+
}
35+
36+
public Mono<Void> deleteMessage() {
37+
return this.channel.flatMap(e -> e.moderate().delete(this.id));
2938
}
3039
}

0 commit comments

Comments
 (0)