1 | #ifndef FACT_ChatClient
|
---|
2 | #define FACT_ChatClient
|
---|
3 |
|
---|
4 | // **************************************************************************
|
---|
5 | /** @class ChatClientImp
|
---|
6 |
|
---|
7 | @brief The base implementation for a chat client
|
---|
8 |
|
---|
9 | **/
|
---|
10 | // **************************************************************************
|
---|
11 | #include "Time.h"
|
---|
12 | #include "MessageDim.h"
|
---|
13 | #include "DimErrorRedirecter.h"
|
---|
14 |
|
---|
15 | using namespace std;
|
---|
16 |
|
---|
17 | class ChatClientImp : public MessageImp, public DimErrorRedirecter, public MessageDimRX
|
---|
18 | {
|
---|
19 | protected:
|
---|
20 | std::ostream &lout; /// Output stream for local synchrounous output
|
---|
21 |
|
---|
22 | int Write(const Time &t, const string &txt, int)
|
---|
23 | {
|
---|
24 | Out() << t << ": " << txt.substr(6) << endl;
|
---|
25 | return 0;
|
---|
26 | }
|
---|
27 |
|
---|
28 | protected:
|
---|
29 | // Redirect asynchronous output to the output window
|
---|
30 | ChatClientImp(std::ostream &out, std::ostream &in) :
|
---|
31 | MessageImp(out),
|
---|
32 | DimErrorRedirecter(static_cast<MessageImp&>(*this)),
|
---|
33 | MessageDimRX("CHAT", static_cast<MessageImp&>(*this)),
|
---|
34 | lout(in)
|
---|
35 | {
|
---|
36 | Out() << Time::fmt("%H:%M:%S");
|
---|
37 | }
|
---|
38 | };
|
---|
39 |
|
---|
40 | // **************************************************************************
|
---|
41 | /** @class ChatClient
|
---|
42 |
|
---|
43 | @brief Implements a remote control based on a Readline class for the Chat client
|
---|
44 |
|
---|
45 | @tparam T
|
---|
46 | The base class for ChatClient. Either Readline or a class
|
---|
47 | deriving from it. This is usually either Console or Shell.
|
---|
48 |
|
---|
49 | **/
|
---|
50 | // **************************************************************************
|
---|
51 | #include "WindowLog.h"
|
---|
52 | #include "ReadlineColor.h"
|
---|
53 | #include "tools.h"
|
---|
54 |
|
---|
55 | template <class T>
|
---|
56 | class ChatClient : public T, public ChatClientImp
|
---|
57 | {
|
---|
58 | public:
|
---|
59 | // Redirect asynchronous output to the output window
|
---|
60 | ChatClient(const char *name) : T(name),
|
---|
61 | ChatClientImp(T::GetStreamOut(), T::GetStreamIn())
|
---|
62 | {
|
---|
63 | }
|
---|
64 |
|
---|
65 | // returns whether a command should be put into the history
|
---|
66 | bool Process(const std::string &str)
|
---|
67 | {
|
---|
68 | if (ReadlineColor::Process(lout, str))
|
---|
69 | return true;
|
---|
70 |
|
---|
71 | if (T::Process(str))
|
---|
72 | return true;
|
---|
73 |
|
---|
74 | const int rc = DimClient::sendCommand("CHAT/MSG", str.c_str());
|
---|
75 | if (!rc)
|
---|
76 | lout << kRed << "ERROR - Sending message failed." << endl;
|
---|
77 |
|
---|
78 | return false;
|
---|
79 | }
|
---|
80 |
|
---|
81 | std::string GetUpdatePrompt() const
|
---|
82 | {
|
---|
83 | // If we have not cd'ed to a server show only the line start
|
---|
84 | return T::GetLinePrompt() + " " + (IsConnected() ? "" : "dis") + "connected> ";
|
---|
85 | }
|
---|
86 | };
|
---|
87 |
|
---|
88 |
|
---|
89 |
|
---|
90 | // **************************************************************************
|
---|
91 | /** @class ChatConsole
|
---|
92 |
|
---|
93 | @brief Derives the ChatClient from Control and adds a proper prompt
|
---|
94 |
|
---|
95 | */
|
---|
96 | // **************************************************************************
|
---|
97 | #include "Console.h"
|
---|
98 |
|
---|
99 | class ChatConsole : public ChatClient<Console>
|
---|
100 | {
|
---|
101 | public:
|
---|
102 | ChatConsole(const char *name, bool continous=false) :
|
---|
103 | ChatClient<Console>(name)
|
---|
104 | {
|
---|
105 | SetContinous(continous);
|
---|
106 | }
|
---|
107 | };
|
---|
108 |
|
---|
109 | // **************************************************************************
|
---|
110 | /** @class ChatShell
|
---|
111 |
|
---|
112 | @brief Derives the ChatClient from Shell and adds colored prompt
|
---|
113 |
|
---|
114 | */
|
---|
115 | // **************************************************************************
|
---|
116 | #include "Shell.h"
|
---|
117 |
|
---|
118 | class ChatShell : public ChatClient<Shell>
|
---|
119 | {
|
---|
120 | public:
|
---|
121 | ChatShell(const char *name, bool = false) :
|
---|
122 | ChatClient<Shell>(name)
|
---|
123 | {
|
---|
124 | }
|
---|
125 | };
|
---|
126 |
|
---|
127 | #endif
|
---|