summaryrefslogtreecommitdiff
path: root/src/chat-server/chatchannel.hpp
blob: 6600f42c0d4204d819a7acf5c57662783688367d (plain) (blame)
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
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
/*
 *  The Mana Server
 *  Copyright (C) 2004  The Mana World Development Team
 *
 *  This file is part of The Mana Server.
 *
 *  The Mana Server is free software; you can redistribute it and/or modify
 *  it under the terms of the GNU General Public License as published by
 *  the Free Software Foundation; either version 2 of the License, or
 *  any later version.
 *
 *  The Mana Server is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 *  GNU General Public License for more details.
 *
 *  You should have received a copy of the GNU General Public License
 *  along with The Mana Server.  If not, see <http://www.gnu.org/licenses/>.
 */

#ifndef CHATCHANNEL_H
#define CHATCHANNEL_H

#include <string>
#include <vector>

class ChatClient;

/**
 * A chat channel. Optionally a channel is private, in which case a password is
 * required to join it.
 *
 * No logic is currently associated with a chat channel except for making sure
 * that no user joins the channel twice and checking that a user who leaves
 * actually existed in the channel.
 *
 * @todo <b>b_lindeijer:</b> It would be nicer when some more logic could be
 *       placed in this class to remove some weight from the ChatHandler.
 */
class ChatChannel
{
    public:
        typedef std::vector< ChatClient * > ChannelUsers;

        /**
         * Constructor.
         *
         * @param name         the name of the channel.
         * @param announcement a welcome message.
         * @param password     password (for private channels).
         * @param privacy      whether this channel is private.
         */
        ChatChannel(int id,
                    const std::string &name,
                    const std::string &announcement = std::string(),
                    const std::string &password = std::string(),
                    bool joinable = true);

        /**
         * Get the ID of the channel.
         */
        int getId() const
        { return mId; }

        /**
         * Get the name of the channel.
         */
        const std::string& getName() const
        { return mName; }

        /**
         * Get the announcement string of the channel.
         */
        const std::string& getAnnouncement() const
        { return mAnnouncement; }

        /**
         * Get the password of the channel.
         */
        const std::string& getPassword() const
        { return mPassword; }

        /**
         * Sets the name of the channel.
         */
        void setName(const std::string &channelName)
        { mName = channelName; }

        /**
         * Sets the announcement string of the channel.
         */
        void setAnnouncement(const std::string &channelAnnouncement)
        { mAnnouncement = channelAnnouncement; }

        /**
         * Sets the password of the channel.
         */
        void setPassword(const std::string &channelPassword)
        { mPassword = channelPassword; }

        /**
         * Gets the list of the users registered in the channel.
         */
        const ChannelUsers& getUserList() const
        { return mRegisteredUsers; }

        /**
         * Adds a user to the channel.
         *
         * @return whether the user was successfully added
         */
        bool addUser(ChatClient *);

        /**
         * Removes a user from the channel.
         *
         * @return whether the user was successfully removed
         */
        bool removeUser(ChatClient *);

        /**
         * Empties a channel from its users (admin included).
         */
        void removeAllUsers();

        /**
         * Get whether a user can join this channel
         */
        bool canJoin() const;

        /**
         * Set user mode
         */
        void setUserMode(ChatClient *, unsigned char mode);

        /**
         * Get user mode
         */
        std::string getUserMode(ChatClient *);

    private:
        unsigned short mId;            /**< The ID of the channel. */
        std::string mName;             /**< The name of the channel. */
        std::string mAnnouncement;     /**< Welcome message. */
        std::string mPassword;         /**< The channel password. */
        bool mJoinable;                /**< Whether anyone can join. */
        ChannelUsers mRegisteredUsers; /**< Users in this channel. */
        std::string mOwner;             /**< Channel owner character name */
};

#endif