kameloso.plugins.printer.formatting

Implementation of Printer plugin functionality that concerns formatting. For internal use.

The IRCEvent-annotated handlers must be in the same module as the PrinterPlugin, but these implementation functions can be offloaded here to limit module size a bit.

Members

Functions

containsNickname
auto containsNickname(string haystack, string needle)

Searches a string for a substring that isn't surrounded by characters that can be part of a nickname. This can detect a nickname in a string without getting false positives from similar nicknames.

formatMessageColoured
void formatMessageColoured(PrinterPlugin plugin, Sink sink, IRCEvent event, bool bellOnMention, bool bellOnError)

Formats an IRCEvent into an output range sink, coloured.

withoutTypePrefix
auto withoutTypePrefix(string typestring)

Slices away any type prefixes from the string name of an IRCEvent.Type.

Examples

1 import kameloso.plugins : IRCPluginState;
2 import lu.assert_ : assertMultilineEquals;
3 import std.array : Appender;
4 
5 Appender!(char[]) sink;
6 
7 IRCPluginState state;
8 state.server.daemon = IRCServer.Daemon.twitch;
9 state.client.nickname = "nickname";
10 PrinterPlugin plugin = new PrinterPlugin(state);
11 
12 IRCEvent event;
13 
14 with (event.sender)
15 {
16     nickname = "nickname";
17     address = "127.0.0.1";
18     version(TwitchSupport) displayName = "Nickname";
19     account = "n1ckn4m3";
20     class_ = IRCUser.Class.whitelist;
21 }
22 
23 event.type = IRCEvent.Type.JOIN;
24 event.channel.name = "#channel";
25 
26 {
27     formatMessageMonochrome(plugin, sink, event, bellOnMention: false, bellOnError: false);
28     immutable joinLine = sink[][11..$].idup;
29     version(TwitchSupport) string nickstring = "Nickname";
30     else string nickstring = "nickname";
31     //nickstring ~= "/whitelist";
32     immutable expected = "[join] [#channel] " ~ nickstring;
33     assertMultilineEquals(actual: joinLine, expected: expected);
34     sink.clear();
35 }
36 
37 event.type = IRCEvent.Type.CHAN;
38 event.content = "Harbl snarbl";
39 
40 {
41     formatMessageMonochrome(plugin, sink, event, bellOnMention: false, bellOnError: false);
42     immutable chanLine = sink[][11..$].idup;
43     version(TwitchSupport) string nickstring = "Nickname";
44     else string nickstring = "nickname";
45     //nickstring ~= "/whitelist";
46     immutable expected = "[chan] [#channel] " ~ nickstring ~ `: "Harbl snarbl"`;
47     assertMultilineEquals(actual: chanLine, expected: expected);
48     sink.clear();
49 }
50 
51 plugin.settings.classNames = true;
52 event.sender.badges = "broadcaster/0,moderator/1,subscriber/9";
53 event.sender.class_ = IRCUser.Class.staff;
54 //colour = "#3c507d";
55 
56 version(TwitchSupport)
57 {{
58     formatMessageMonochrome(plugin, sink, event, bellOnMention: false, bellOnError: false);
59     immutable twitchLine = sink[][11..$].idup;
60     version(TwitchSupport) string nickstring = "Nickname";
61     else string nickstring = "nickname";
62     nickstring ~= "/staff";
63     immutable expected = "[chan] [#channel] " ~ nickstring ~
64         ` [broadcaster/0,moderator/1,subscriber/9]: "Harbl snarbl"`;
65     assertMultilineEquals(actual: twitchLine, expected: expected);
66     sink.clear();
67     event.sender.badges = string.init;
68 }}
69 
70 plugin.settings.accountNames = true;
71 plugin.state.server.daemon = IRCServer.Daemon.inspircd;
72 event.sender.class_ = IRCUser.Class.anyone;
73 event.type = IRCEvent.Type.ACCOUNT;
74 event.channel.name = string.init;
75 event.content = string.init;
76 //event.sender.account = "n1ckn4m3";
77 event.aux[0] = "n1ckn4m3";
78 
79 {
80     formatMessageMonochrome(plugin, sink, event, bellOnMention: false, bellOnError: false);
81     immutable accountLine = sink[][11..$].idup;
82     version(TwitchSupport) string nickstring = "Nickname";
83     else string nickstring = "nickname";
84     nickstring ~= "/anyone";
85     nickstring ~= " (n1ckn4m3)";
86     immutable expected = "[account] " ~ nickstring ~ " (n1ckn4m3)";
87     assertMultilineEquals(actual: accountLine, expected: expected);
88     sink.clear();
89 }
90 
91 event.errors = "DANGER WILL ROBINSON";
92 event.content = "Blah balah";
93 event.num = 666;
94 event.count[0] = -42;
95 event.count[1] = 123;
96 event.count[5] = 420;
97 event.aux[0] = string.init;
98 event.aux[1] = "aux1";
99 event.aux[4] = "aux5";
100 event.type = IRCEvent.Type.ERROR;
101 
102 {
103     formatMessageMonochrome(plugin, sink, event, bellOnMention: false, bellOnError: false);
104     immutable errorLine = sink[][11..$].idup;
105     version(TwitchSupport) string nickstring = "Nickname";
106     else string nickstring = "nickname";
107     nickstring ~= "/anyone";
108     nickstring ~= " (n1ckn4m3)";
109     immutable expected = "[error] " ~ nickstring ~ `: "Blah balah" (aux1) (aux5) ` ~
110         "{-42} {123} {420} [#666] ! DANGER WILL ROBINSON !";
111     //assert((errorLine == expected), errorLine);
112     assertMultilineEquals(actual: errorLine, expected: expected);
113     sink.clear();
114 }
115 
116 plugin.settings.classNames = false;
117 event.type = IRCEvent.Type.CHAN;
118 event.channel.name = "#nickname";
119 event.num = 0;
120 event.count = typeof(IRCEvent.count).init;
121 event.aux = typeof(IRCEvent.aux).init;
122 event.errors = string.init;
123 
124 {
125     formatMessageMonochrome(plugin, sink, event, bellOnMention: false, bellOnError: false);
126     immutable line = sink[][11..$].idup;
127     version(TwitchSupport) string nickstring = "Nickname";
128     else string nickstring = "nickname";
129     //nickstring ~= "/anyone";
130     nickstring ~= " (n1ckn4m3)";
131     immutable expected = "[chan] [#nickname] " ~ nickstring ~ `: "Blah balah"`;
132     assertMultilineEquals(actual: line, expected: expected);
133     sink.clear();
134 }
135 
136 plugin.settings.channelIDs = true;
137 event.channel.id = 123;
138 event.subchannel.name = "#sub";
139 event.subchannel.id = 456;
140 event.altcontent = "alt alt alt alt";
141 
142 {
143     formatMessageMonochrome(plugin, sink, event, bellOnMention: false, bellOnError: false);
144     immutable line = sink[][11..$].idup;
145     version(TwitchSupport) string nickstring = "Nickname";
146     else string nickstring = "nickname";
147     //nickstring ~= "/anyone";
148     nickstring ~= " (n1ckn4m3)";
149     immutable expected = "[chan] [#nickname:123] < [#sub:456] " ~ nickstring ~ `: "Blah balah" | alt alt alt alt`;
150     assertMultilineEquals(actual: line, expected: expected);
151     sink.clear();
152 }
153 
154 event.content = string.init;
155 
156 {
157     formatMessageMonochrome(plugin, sink, event, bellOnMention: false, bellOnError: false);
158     immutable line = sink[][11..$].idup;
159     version(TwitchSupport) string nickstring = "Nickname";
160     else string nickstring = "nickname";
161     //nickstring ~= "/anyone";
162     nickstring ~= " (n1ckn4m3)";
163     immutable expected = "[chan] [#nickname:123] < [#sub:456] " ~ nickstring ~ ` alt alt alt alt`;
164     assertMultilineEquals(actual: line, expected: expected);
165     //sink.clear();
166 }

See Also

Meta