game: prepare guild comment reads
This commit is contained in:
@@ -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));
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user