Chatterino
Channel.hpp
Go to the documentation of this file.
1 #pragma once
2 
4 #include "common/FlagsEnum.hpp"
6 
7 #include <QDate>
8 #include <QString>
9 #include <QTimer>
10 #include <boost/optional.hpp>
11 #include <pajlada/signals/signal.hpp>
12 
13 #include <memory>
14 
15 namespace chatterino {
16 
17 struct Message;
18 using MessagePtr = std::shared_ptr<const Message>;
19 enum class MessageFlag : int64_t;
20 using MessageFlags = FlagsEnum<MessageFlag>;
21 
22 enum class TimeoutStackStyle : int {
23  StackHard = 0,
25  DontStack = 2,
26 
28 };
29 
30 class Channel : public std::enable_shared_from_this<Channel>
31 {
32 public:
33  enum class Type {
34  None,
35  Direct,
36  Twitch,
37  TwitchWhispers,
38  TwitchWatching,
39  TwitchMentions,
40  TwitchLive,
41  TwitchEnd,
42  Irc,
43  Misc
44  };
45 
46  explicit Channel(const QString &name, Type type);
47  virtual ~Channel();
48 
49  // SIGNALS
50  pajlada::Signals::Signal<const QString &, const QString &, bool &>
52  pajlada::Signals::Signal<const QString &, const QString &, const QString &,
53  bool &>
55  pajlada::Signals::Signal<MessagePtr &> messageRemovedFromStart;
56  pajlada::Signals::Signal<MessagePtr &, boost::optional<MessageFlags>>
58  pajlada::Signals::Signal<std::vector<MessagePtr> &> messagesAddedAtStart;
59  pajlada::Signals::Signal<size_t, MessagePtr &> messageReplaced;
61  pajlada::Signals::Signal<const std::vector<MessagePtr> &> filledInMessages;
62  pajlada::Signals::NoArgSignal destroyed;
63  pajlada::Signals::NoArgSignal displayNameChanged;
65  pajlada::Signals::NoArgSignal connected;
66 
67  Type getType() const;
68  const QString &getName() const;
69  virtual const QString &getDisplayName() const;
70  virtual const QString &getLocalizedName() const;
71  bool isTwitchChannel() const;
72  virtual bool isEmpty() const;
73  LimitedQueueSnapshot<MessagePtr> getMessageSnapshot();
74 
75  // MESSAGES
76  // overridingFlags can be filled in with flags that should be used instead
77  // of the message's flags. This is useful in case a flag is specific to a
78  // type of split
79  void addMessage(
80  MessagePtr message,
81  boost::optional<MessageFlags> overridingFlags = boost::none);
82  void addMessagesAtStart(const std::vector<MessagePtr> &messages_);
83 
85  void fillInMissingMessages(const std::vector<MessagePtr> &messages);
86 
87  void addOrReplaceTimeout(MessagePtr message);
88  void disableAllMessages();
89  void replaceMessage(MessagePtr message, MessagePtr replacement);
90  void replaceMessage(size_t index, MessagePtr replacement);
91  void deleteMessage(QString messageID);
92 
93  MessagePtr findMessage(QString messageID);
94 
95  bool hasMessages() const;
96 
97  // CHANNEL INFO
98  virtual bool canSendMessage() const;
99  virtual bool isWritable() const; // whether split input will be usable
100  virtual void sendMessage(const QString &message);
101  virtual bool isMod() const;
102  virtual bool isBroadcaster() const;
103  virtual bool hasModRights() const;
104  virtual bool hasHighRateLimit() const;
105  virtual bool isLive() const;
106  virtual bool shouldIgnoreHighlights() const;
107  virtual bool canReconnect() const;
108  virtual void reconnect();
109 
110  static std::shared_ptr<Channel> getEmpty();
111 
113  QDate lastDate_;
114 
115 protected:
116  virtual void onConnected();
117 
118 private:
119  const QString name_;
120  LimitedQueue<MessagePtr> messages_;
121  Type type_;
122  QTimer clearCompletionModelTimer_;
123 };
124 
125 using ChannelPtr = std::shared_ptr<Channel>;
126 
128 {
129  struct Data {
130  ChannelPtr channel;
131  Channel::Type type;
132  pajlada::Signals::NoArgSignal changed;
133 
134  Data(ChannelPtr channel, Channel::Type type);
135  };
136 
137 public:
138  IndirectChannel(ChannelPtr channel,
140 
141  ChannelPtr get() const;
142  void reset(ChannelPtr channel);
143  pajlada::Signals::NoArgSignal &getChannelChanged();
144  Channel::Type getType();
145 
146 private:
147  std::shared_ptr<Data> data_;
148 };
149 
150 } // namespace chatterino
pajlada::Signals::Signal< size_t, MessagePtr & > messageReplaced
Definition: Channel.hpp:59
CompletionModel completionModel
Definition: Channel.hpp:112
TimeoutStackStyle
Definition: Channel.hpp:22
pajlada::Signals::Signal< const std::vector< MessagePtr > & > filledInMessages
Invoked when some number of messages were filled in using time received.
Definition: Channel.hpp:61
Definition: Application.cpp:48
pajlada::Signals::NoArgSignal displayNameChanged
Definition: Channel.hpp:63
pajlada::Signals::Signal< MessagePtr &, boost::optional< MessageFlags > > messageAppended
Definition: Channel.hpp:57
pajlada::Signals::NoArgSignal connected
Invoked when AbstractIrcServer::onReadConnected occurs.
Definition: Channel.hpp:65
pajlada::Signals::Signal< std::vector< MessagePtr > & > messagesAddedAtStart
Definition: Channel.hpp:58
Type
Definition: Channel.hpp:33
Definition: FlagsEnum.hpp:9
MessageFlag
Definition: Message.hpp:18
Definition: Channel.hpp:30
int64_t FlagsEnum< MessageFlag > MessageFlags
Definition: Channel.hpp:20
pajlada::Signals::Signal< MessagePtr & > messageRemovedFromStart
Definition: Channel.hpp:55
pajlada::Signals::Signal< const QString &, const QString &, bool & > sendMessageSignal
Definition: Channel.hpp:51
QDate lastDate_
Definition: Channel.hpp:113
pajlada::Signals::Signal< const QString &, const QString &, const QString &, bool & > sendReplySignal
Definition: Channel.hpp:54
pajlada::Signals::NoArgSignal destroyed
Definition: Channel.hpp:62
std::shared_ptr< const Message > MessagePtr
Definition: Channel.hpp:18
Definition: CompletionModel.hpp:13
QString name
Definition: Credentials.cpp:94
Definition: Channel.hpp:127
std::shared_ptr< Channel > ChannelPtr
Definition: Channel.hpp:125