GCC Code Coverage Report
Directory: src/ Exec Total Coverage
File: src/net/ea/partyrecv.cpp Lines: 1 84 1.2 %
Date: 2021-03-17 Branches: 0 104 0.0 %

Line Branch Exec Source
1
/*
2
 *  The ManaPlus Client
3
 *  Copyright (C) 2008  Lloyd Bryant <[email protected]>
4
 *  Copyright (C) 2011-2019  The ManaPlus Developers
5
 *  Copyright (C) 2019-2021  Andrei Karas
6
 *
7
 *  This file is part of The ManaPlus Client.
8
 *
9
 *  This program is free software; you can redistribute it and/or modify
10
 *  it under the terms of the GNU General Public License as published by
11
 *  the Free Software Foundation; either version 2 of the License, or
12
 *  any later version.
13
 *
14
 *  This program is distributed in the hope that it will be useful,
15
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
16
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
17
 *  GNU General Public License for more details.
18
 *
19
 *  You should have received a copy of the GNU General Public License
20
 *  along with this program.  If not, see <http://www.gnu.org/licenses/>.
21
 */
22
23
#include "net/ea/partyrecv.h"
24
25
#include "actormanager.h"
26
#include "configuration.h"
27
#include "notifymanager.h"
28
#include "party.h"
29
30
#include "being/localplayer.h"
31
32
#include "enums/resources/notifytypes.h"
33
34
#include "gui/windows/chatwindow.h"
35
#include "gui/windows/socialwindow.h"
36
37
#include "net/messagein.h"
38
39
#include "gui/widgets/tabs/chat/partytab.h"
40
41
#include "utils/delete2.h"
42
43
#include "debug.h"
44
45
namespace Ea
46
{
47
48
Party *taParty = nullptr;
49
50
namespace PartyRecv
51
{
52
    PartyShareT mShareExp = PartyShare::UNKNOWN;
53
    PartyShareT mShareItems = PartyShare::UNKNOWN;
54
}  // namespace PartyRecv
55
56
void PartyRecv::processPartyCreate(Net::MessageIn &msg)
57
{
58
    if (msg.readUInt8("flag") != 0U)
59
        NotifyManager::notify(NotifyTypes::PARTY_CREATE_FAILED);
60
    else
61
        NotifyManager::notify(NotifyTypes::PARTY_CREATED);
62
}
63
64
void PartyRecv::processPartyExpSettingsContinue(Net::MessageIn &msg,
65
                                                const PartyShareT exp)
66
{
67
    switch (exp)
68
    {
69
        case PartyShare::YES:
70
            if (mShareExp == PartyShare::YES)
71
                break;
72
            mShareExp = PartyShare::YES;
73
            NotifyManager::notify(NotifyTypes::PARTY_EXP_SHARE_ON);
74
            break;
75
        case PartyShare::NO:
76
            if (mShareExp == PartyShare::NO)
77
                break;
78
            mShareExp = PartyShare::NO;
79
            NotifyManager::notify(NotifyTypes::PARTY_EXP_SHARE_OFF);
80
            break;
81
        case PartyShare::NOT_POSSIBLE:
82
            if (mShareExp == PartyShare::NOT_POSSIBLE)
83
                break;
84
            mShareExp = PartyShare::NOT_POSSIBLE;
85
            NotifyManager::notify(NotifyTypes::PARTY_EXP_SHARE_ERROR);
86
            break;
87
        default:
88
        case PartyShare::UNKNOWN:
89
            UNIMPLEMENTEDPACKETFIELD(CAST_S32(exp));
90
            break;
91
    }
92
}
93
94
void PartyRecv::processPartyItemSettingsContinue(Net::MessageIn &msg,
95
                                                 const PartyShareT item)
96
{
97
    switch (item)
98
    {
99
        case PartyShare::YES:
100
            if (mShareItems == PartyShare::YES)
101
                break;
102
            mShareItems = PartyShare::YES;
103
            NotifyManager::notify(NotifyTypes::PARTY_ITEM_SHARE_ON);
104
            break;
105
        case PartyShare::NO:
106
            if (mShareItems == PartyShare::NO)
107
                break;
108
            mShareItems = PartyShare::NO;
109
            NotifyManager::notify(NotifyTypes::PARTY_ITEM_SHARE_OFF);
110
            break;
111
        case PartyShare::NOT_POSSIBLE:
112
            if (mShareItems == PartyShare::NOT_POSSIBLE)
113
                break;
114
            mShareItems = PartyShare::NOT_POSSIBLE;
115
            NotifyManager::notify(NotifyTypes::PARTY_ITEM_SHARE_ERROR);
116
            break;
117
        default:
118
        case PartyShare::UNKNOWN:
119
            UNIMPLEMENTEDPACKETFIELD(CAST_S32(item));
120
            break;
121
    }
122
}
123
124
void PartyRecv::processPartyLeave(Net::MessageIn &msg)
125
{
126
    const BeingId id = msg.readBeingId("account id");
127
    const std::string nick = msg.readString(24, "nick");
128
    const int reason = msg.readUInt8("flag");
129
    if (localPlayer == nullptr)
130
        return;
131
132
    if (id == localPlayer->getId())
133
    {
134
        switch (reason)
135
        {
136
            case 0:
137
            default:
138
                NotifyManager::notify(NotifyTypes::PARTY_LEFT);
139
                break;
140
141
            case 1:
142
                NotifyManager::notify(NotifyTypes::PARTY_KICKED);
143
                break;
144
145
            case 2:
146
                NotifyManager::notify(NotifyTypes::PARTY_LEFT_DENY);
147
                break;
148
149
            case 3:
150
                NotifyManager::notify(NotifyTypes::PARTY_KICK_DENY);
151
                break;
152
        }
153
154
        if (reason >= 2)
155
            return;
156
157
        if (Ea::taParty != nullptr)
158
        {
159
            Ea::taParty->removeFromMembers();
160
            Ea::taParty->clearMembers();
161
        }
162
163
        delete2(partyTab)
164
165
        if ((socialWindow != nullptr) && (Ea::taParty != nullptr))
166
            socialWindow->removeTab(Ea::taParty);
167
        localPlayer->setPartyName("");
168
    }
169
    else
170
    {
171
        switch (reason)
172
        {
173
            case 0:
174
            default:
175
                NotifyManager::notify(NotifyTypes::PARTY_USER_LEFT, nick);
176
                break;
177
178
            case 1:
179
                NotifyManager::notify(NotifyTypes::PARTY_USER_KICKED, nick);
180
                break;
181
182
            case 2:
183
                NotifyManager::notify(NotifyTypes::PARTY_USER_LEFT_DENY, nick);
184
                break;
185
186
            case 3:
187
                NotifyManager::notify(NotifyTypes::PARTY_USER_KICK_DENY, nick);
188
                break;
189
        }
190
191
        if (reason >= 2)
192
            return;
193
194
        if (actorManager != nullptr)
195
        {
196
            Being *const b = actorManager->findBeing(id);
197
            if ((b != nullptr) && b->getType() == ActorType::Player)
198
            {
199
                b->setParty(nullptr);
200
                b->setPartyName("");
201
            }
202
        }
203
        if (Ea::taParty != nullptr)
204
            Ea::taParty->removeMember(id);
205
    }
206
}
207
208
void PartyRecv::processPartyUpdateCoords(Net::MessageIn &msg)
209
{
210
    const BeingId id = msg.readBeingId("account id");
211
    PartyMember *m = nullptr;
212
    if (Ea::taParty != nullptr)
213
        m = Ea::taParty->getMember(id);
214
    if (m != nullptr)
215
    {
216
        m->setX(msg.readInt16("x"));
217
        m->setY(msg.readInt16("y"));
218
    }
219
    else
220
    {
221
        msg.readInt16("x");
222
        msg.readInt16("y");
223
    }
224
}
225
226
void PartyRecv::createTab()
227
{
228
    partyTab = new PartyTab(chatWindow);
229
    if (config.getBoolValue("showChatHistory"))
230
        partyTab->loadFromLogFile("#Party");
231
}
232
233
2
}  // namespace Ea