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.
Formats an IRCEvent into an output range sink, coloured.
Slices away any type prefixes from the string name of an IRCEvent.Type.
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 }
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.