1 /*
2  *      ircengine.h
3  *
4  *      Copyright 2010 David Vachulka <arch_dvx@users.sourceforge.net>
5  *
6  *      This program is free software; you can redistribute it and/or modify
7  *      it under the terms of the GNU General Public License as published by
8  *      the Free Software Foundation; either version 2 of the License, or
9  *      (at your option) any later version.
10  *
11  *      This program is distributed in the hope that it will be useful,
12  *      but WITHOUT ANY WARRANTY; without even the implied warranty of
13  *      MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14  *      GNU General Public License for more details.
15  *
16  *      You should have received a copy of the GNU General Public License
17  *      along with this program; if not, write to the Free Software
18  *      Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
19  *      MA 02110-1301, USA.
20  */
21 
22 
23 #ifndef IRCENGINE_H
24 #define IRCENGINE_H
25 
26 #ifndef DXSOCKET_H
27 #include "dxsocket.h"
28 #endif
29 #include "defs.h"
30 #include "config.h"
31 #include "dxutils.h"
32 
33 class IrcEngine: public FXObject
34 {
35     FXDECLARE(IrcEngine)
36     friend class IrcTabItem;
37     public:
38         IrcEngine(FXApp*, FXObject*, FXString, FXString);
39         virtual ~IrcEngine();
40 
41         void startConnection();
42         void disconnect();
43         void disconnect(const FXString &reason);
44         void reconnect();
45         void closeConnection(FXbool disableReconnect=FALSE);
46         void appendTarget(FXObject*);
47         void removeTarget(FXObject*);
48         FXbool findTarget(FXObject*);
49         FXbool clearTarget();
clearAttempts()50         void clearAttempts() { m_attempts = 0; }
setServerName(const FXString & name)51         void setServerName(const FXString &name) { m_serverName = name; }
getServerName()52         FXString getServerName() const { return m_serverName; }
getNetworkName()53         FXString getNetworkName() const { return m_networkName; }
setServerPort(FXint port)54         void setServerPort(FXint port) { m_serverPort = port; }
getServerPort()55         FXint getServerPort() const { return m_serverPort; }
setServerPassword(const FXString & pass)56         void setServerPassword(const FXString &pass) { m_serverPassword = pass; }
setNickName(const FXString & nick)57         void setNickName(const FXString &nick) { m_nickName = nick; }
getNickName()58         FXString getNickName() const { return m_nickName; }
59         void setUserName(const FXString &user);
setRealName(const FXString & realname)60         void setRealName(const FXString &realname) { m_realName = realname; }
setStartChannels(const FXString & channels)61         void setStartChannels(const FXString &channels) { m_startChannels = dxutils::removeSpaces(channels); }
setStartCommands(const FXString & commands)62         void setStartCommands(const FXString &commands) { m_startCommands = commands; }
setUseSsl(const FXbool & usessl)63         void setUseSsl(const FXbool &usessl) { m_useSsl = usessl; }
getConnected()64         FXbool getConnected() const { return m_connected; }
getConnecting()65         FXbool getConnecting() const { return m_connecting; }
getUseSsl()66         FXbool getUseSsl() const { return m_useSsl; }
getNickLen()67         FXint getNickLen() const { return m_nickLen; }
getTopicLen()68         FXint getTopicLen() const { return m_topicLen; }
getKickLen()69         FXint getKickLen() const { return m_kickLen; }
getAwayLen()70         FXint getAwayLen() const { return m_awayLen; }
getAdminPrefix()71         FXchar getAdminPrefix() const { return m_adminPrefix; }
getOwnerPrefix()72         FXchar getOwnerPrefix() const { return m_ownerPrefix; }
getOpPrefix()73         FXchar getOpPrefix() const { return m_opPrefix; }
getVoicePrefix()74         FXchar getVoicePrefix() const { return m_voicePrefix; }
getHalfopPrefix()75         FXchar getHalfopPrefix() const { return m_halfopPrefix; }
getChanTypes()76         FXString getChanTypes() const { return m_chanTypes; }
getLocalIP()77         FXString getLocalIP() { return m_socket->getLocalIP(); }
78         FXString getLocalIPBinary();
79         FXString getHostname(const FXString &address);
getRemoteIP()80         FXString getRemoteIP() { return m_socket->getRemoteIP(); }
81         void addIgnoreWho(const FXString &who);
82         void addNick(const FXString &nick, const FXString &user, const FXString &real, const FXString &host, const FXbool &away);
83         void addNick(const FXString &nick, const FXString &user, const FXString &real, const FXString &host);
84         void removeNick(const FXString &nick);
85         NickInfo getNickInfo(const FXString &nick) const;
86         FXString getBannedNick(const FXString &banmask) const;
87         dxStringArray getChannelsList() const;
88         void clearChannelsList();
89         FXbool sendAdmin(const FXString &params);
90         FXbool sendAway(const FXString &params);
91         FXbool sendBanlist(const FXString &channel);
92         FXbool sendCtcp(const FXString &to, const FXString &params);
93         FXbool sendCtcpNotice(const FXString &to, const FXString &params);
94         FXbool sendMode(const FXString &params);
95         FXbool sendInvite(const FXString &to, const FXString &params);
96         FXbool sendJoin(const FXString &chan);
97         FXbool sendKick(const FXString &chan, const FXString &nick, const FXString &reason);
98         FXbool sendKill(const FXString &nick, const FXString &reason);
99         FXbool sendList(const FXString &params);
100         FXbool sendMe(const FXString &to, const FXString &message);
101         FXbool sendMsg(const FXString &to, const FXString &message);
102         /** Send names request
103          *
104          * @param channel   name of channel
105          * @param list      true if command answer could be show
106          * @return          true is command was succesfull
107          */
108         FXbool sendNames(const FXString &channel, FXbool list);
109         FXbool sendNick(const FXString &nick);
110         FXbool sendNotice(const FXString &to, const FXString &message);
111         FXbool sendOper(const FXString &login, const FXString &password);
112         FXbool sendPart(const FXString &chan);
113         FXbool sendPart(const FXString &chan, const FXString &reason);
114         FXbool sendQuote(const FXString &text);
115         FXbool sendStats(const FXString &type);
116         FXbool sendTopic(const FXString &chan, const FXString &topic);
117         FXbool sendTopic(const FXString &chan);
118         FXbool sendVersion(const FXString &to);
119         FXbool sendWallops(const FXString &msg);
120         FXbool sendWho(const FXString &mask);
121         FXbool sendWhoami();
122         FXbool sendWhois(const FXString &params);
123         FXbool sendWhowas(const FXString &params);
124         FXbool isUserIgnored(FXString nick, FXString user, FXString host, FXString on);
125         FXbool isUserIgnored(FXString nick, FXString on);
126         FXbool isAway(const FXString &nick);
getMyUserHost()127         FXString getMyUserHost() const { return m_myUserHost; }
128 
129         long onSocketCanRead(FXObject*, FXSelector, void*);
130         long onSocketConnected(FXObject*, FXSelector, void*);
131         long onSocketDisconnected(FXObject*, FXSelector, void*);
132         long onSocketError(FXObject*, FXSelector, void*);
133         long onReconnectTimeout(FXObject*, FXSelector, void*);
134         long onTryAgainTimeout(FXObject*, FXSelector, void*);
135         long onPingTimeout(FXObject*, FXSelector, void*);
136         long onJoinDelayTimeout(FXObject*, FXSelector, void*);
137     private:
IrcEngine()138         IrcEngine():m_application(NULL),m_connected(FALSE),m_useSsl(FALSE),m_connecting(FALSE)
139         ,m_endmotd(FALSE),m_ignoreUserHost(FALSE),m_serverPort(0),m_attempts(0),m_nickLen(0)
140         ,m_topicLen(0),m_kickLen(0),m_awayLen(0),m_adminPrefix(' '),m_ownerPrefix(' '),m_opPrefix(' '),m_voicePrefix(' ')
141         ,m_halfopPrefix(' '),m_socket(NULL),m_ping(0)
142         {}
143 
144         FXApp *m_application;
145         FXbool m_connected, m_useSsl, m_connecting, m_endmotd;
146         FXbool m_ignoreUserHost, m_storeChannelList;
147         FXint m_serverPort, m_attempts;
148         FXint m_nickLen, m_topicLen, m_kickLen, m_awayLen;
149         FXString m_serverName, m_networkName, m_serverPassword, m_nickName;
150         FXString m_realName, m_userName, m_startChannels, m_startCommands;
151         FXString m_receiveRest;
152         FXString m_chanTypes; //channel prefixes
153         FXString m_myUserHost; //usefull for dcc
154         FXString m_ignoreWho;
155         FXchar m_adminPrefix, m_ownerPrefix, m_opPrefix, m_voicePrefix, m_halfopPrefix; //prefix for nick modes
156         dxTargetsArray m_targets;
157         dxStringArray m_ignoreWhoQueue, m_namesQueue, m_channelsList;
158         dxNickInfoArray m_nicks;
159         dxSocket *m_socket;
160         FXTime m_ping;
161 
162         void readData();
163         FXbool sendLine(const FXString &line);
164         void sendCommands();
165         FXbool sendCommand(const FXString &commandtext);
166         void parseLine(const FXString &line);
167         void sendEvent(IrcEventType);
168         void sendEvent(IrcEventType, const FXString&);
169         void sendEvent(IrcEventType, const FXString&, const FXString&);
170         void sendEvent(IrcEventType, const FXString&, const FXString&, const FXString&);
171         void sendEvent(IrcEventType, const FXString&, const FXString&, const FXString&, const FXString&);
172         void numeric(const FXint&, const FXString&);
173         void privmsg(const FXString&, const FXString&);
174         void ctcp(const FXString&, const FXString&);
175         void join(const FXString&, const FXString&);
176         void quitirc(const FXString&, const FXString&);
177         void part(const FXString&, const FXString&);
178         void ping(const FXString&);
179         void pong(const FXString&, const FXString&);
180         void notice(const FXString&, const FXString&);
181         void nick(const FXString&, const FXString&);
182         void topic(const FXString&, const FXString&);
183         void invite(const FXString&, const FXString&);
184         void kick(const FXString&, const FXString&);
185         void mode(const FXString&, const FXString&);
186         void error(const FXString&);
187         void unknown(const FXString&, const FXString&);
188         void parseRplsupport(FXString);
189         void makeStartChannels();
190         void clearChannelsCommands(FXbool);
191         void resetReconnect();
192         void sendPingTimeout();
193         bool hasReconnectAttempt();
194 };
195 
196 #endif // IRCENGINE_H
197