game: prepare guild comment reads

This commit is contained in:
server
2026-04-13 21:54:19 +02:00
parent a0ad693e13
commit 0f69efeba4

View File

@@ -92,6 +92,17 @@ namespace
return true;
}
bool PrepareGuildCommentList(CStmt& stmt, uint32_t guildId)
{
const std::string query = std::string("SELECT id, name, content FROM guild_comment") + get_table_postfix()
+ " WHERE guild_id=? ORDER BY notice DESC, id DESC LIMIT " + std::to_string(GUILD_COMMENT_MAX_COUNT);
if (!PrepareGameStmt(stmt, query))
return false;
return stmt.BindParam(MYSQL_TYPE_LONG, &guildId);
}
struct FGuildNameSender
{
FGuildNameSender(uint32_t id, const char* guild_name) : id(id), name(guild_name)
@@ -1131,45 +1142,55 @@ void CGuild::RefreshComment(LPCHARACTER ch)
void CGuild::RefreshCommentForce(DWORD player_id)
{
LPCHARACTER ch = CHARACTER_MANAGER::instance().FindByPID(player_id);
if (ch == NULL) {
if (ch == NULL)
return;
}
auto pmsg = DBManager::instance().DirectQuery("SELECT id, name, content FROM guild_comment%s WHERE guild_id = %u ORDER BY notice DESC, id DESC LIMIT %d", get_table_postfix(), m_data.guild_id, GUILD_COMMENT_MAX_COUNT);
TPacketGCGuild pack;
pack.header = GC::GUILD;
pack.length = sizeof(pack)+1;
pack.length = sizeof(pack) + 1;
pack.subheader = GuildSub::GC::COMMENTS;
BYTE count = pmsg->Get()->uiNumRows;
LPDESC d = ch->GetDesc();
if (!d)
return;
pack.length += (sizeof(DWORD)+CHARACTER_NAME_MAX_LEN+1+GUILD_COMMENT_MAX_LEN+1)*(WORD)count;
d->BufferedPacket(&pack,sizeof(pack));
d->BufferedPacket(&count, 1);
CStmt stmt;
uint32_t id = 0;
char szName[CHARACTER_NAME_MAX_LEN + 1];
char szContent[GUILD_COMMENT_MAX_LEN + 1];
memset(szName, 0, sizeof(szName));
memset(szContent, 0, sizeof(szContent));
for (uint i = 0; i < pmsg->Get()->uiNumRows; i++)
if (!PrepareGuildCommentList(stmt, m_data.guild_id)
|| !stmt.BindResult(MYSQL_TYPE_LONG, &id)
|| !stmt.BindResult(MYSQL_TYPE_STRING, szName, sizeof(szName))
|| !stmt.BindResult(MYSQL_TYPE_STRING, szContent, sizeof(szContent))
|| !stmt.Execute())
{
MYSQL_ROW row = mysql_fetch_row(pmsg->Get()->pSQLResult);
DWORD id = strtoul(row[0], NULL, 10);
return;
}
strlcpy(szName, row[1], sizeof(szName));
strlcpy(szContent, row[2], sizeof(szContent));
BYTE count = static_cast<BYTE>(stmt.iRows);
pack.length += (sizeof(DWORD) + CHARACTER_NAME_MAX_LEN + 1 + GUILD_COMMENT_MAX_LEN + 1) * static_cast<WORD>(count);
d->BufferedPacket(&pack, sizeof(pack));
d->BufferedPacket(&count, 1);
for (BYTE i = 0; i < count; ++i)
{
memset(szName, 0, sizeof(szName));
memset(szContent, 0, sizeof(szContent));
if (!stmt.Fetch())
break;
d->BufferedPacket(&id, sizeof(id));
d->BufferedPacket(szName, sizeof(szName));
if (i == pmsg->Get()->uiNumRows - 1)
d->Packet(szContent, sizeof(szContent)); // 마지막 줄이면 보내기
if (i == count - 1)
d->Packet(szContent, sizeof(szContent));
else
d->BufferedPacket(szContent, sizeof(szContent));
}