-
Notifications
You must be signed in to change notification settings - Fork 6
/
Copy pathIRCMessageTarget.swift
78 lines (62 loc) · 2.27 KB
/
IRCMessageTarget.swift
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
//===----------------------------------------------------------------------===//
//
// This source file is part of the swift-nio-irc open source project
//
// Copyright (c) 2018-2021 ZeeZide GmbH. and the swift-nio-irc project authors
// Licensed under Apache License v2.0
//
// See LICENSE.txt for license information
// See CONTRIBUTORS.txt for the list of SwiftNIOIRC project authors
//
// SPDX-License-Identifier: Apache-2.0
//
//===----------------------------------------------------------------------===//
import struct NIO.EventLoopPromise
/**
* A `IRCMessageTarget` is the reverse to the `IRCMessageDispatcher`.
*
* Both the `IRCClient` and the `IRCServer` objects implement this protocol
* and just its `sendMessages` and `origin` methods.
*
* Extensions then provide extra functionality based on this, the PoP way.
*/
public protocol IRCMessageTarget {
var origin : String? { get }
func sendMessages<T: Collection>(_ messages: T,
promise: EventLoopPromise<Void>?)
where T.Element == IRCMessage
}
public extension IRCMessageTarget {
@inlinable
func sendMessage(_ message: IRCMessage,
promise: EventLoopPromise<Void>? = nil)
{
sendMessages([ message ], promise: promise)
}
}
public extension IRCMessageTarget {
@inlinable
func sendMessage(_ text: String, to recipients: IRCMessageRecipient...) {
guard !recipients.isEmpty else { return }
let lines = text.components(separatedBy: "\n")
.map { $0.replacingOccurrences(of: "\r", with: "") }
let messages = lines.map {
IRCMessage(origin: origin, command: .PRIVMSG(recipients, $0))
}
sendMessages(messages, promise: nil)
}
@inlinable
func sendNotice(_ text: String, to recipients: IRCMessageRecipient...) {
guard !recipients.isEmpty else { return }
let lines = text.components(separatedBy: "\n")
.map { $0.replacingOccurrences(of: "\r", with: "") }
let messages = lines.map {
IRCMessage(origin: origin, command: .NOTICE(recipients, $0))
}
sendMessages(messages, promise: nil)
}
@inlinable
func sendRawReply(_ code: IRCCommandCode, _ args: String...) {
sendMessage(IRCMessage(origin: origin, command: .numeric(code, args)))
}
}