summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/char/int_guild.c1
-rw-r--r--src/char_sql/int_mail.c46
-rw-r--r--src/map/clif.c25
-rw-r--r--src/map/intif.c54
-rw-r--r--src/map/map.c15
-rw-r--r--src/map/map.h1
6 files changed, 57 insertions, 85 deletions
diff --git a/src/char/int_guild.c b/src/char/int_guild.c
index 235ddc77a..563ad360e 100644
--- a/src/char/int_guild.c
+++ b/src/char/int_guild.c
@@ -8,6 +8,7 @@
#include "../common/db.h"
#include "../common/lock.h"
#include "../common/showmsg.h"
+#include "../common/strlib.h"
#include "char.h"
#include "inter.h"
#include "int_storage.h"
diff --git a/src/char_sql/int_mail.c b/src/char_sql/int_mail.c
index bdf7653f1..528c1be11 100644
--- a/src/char_sql/int_mail.c
+++ b/src/char_sql/int_mail.c
@@ -128,10 +128,10 @@ static int mail_savemessage(struct mail_message* msg)
|| SQL_SUCCESS != SqlStmt_BindParam(stmt, 3, SQLDT_STRING, msg->body, strnlen(msg->body, MAIL_BODY_LENGTH))
|| SQL_SUCCESS != SqlStmt_Execute(stmt) )
{
- Sql_ShowDebug(sql_handle);
+ SqlStmt_ShowDebug(stmt);
j = 0;
} else
- j = (int)Sql_LastInsertId(sql_handle);
+ j = (int)SqlStmt_LastInsertId(stmt);
StringBuf_Destroy(&buf);
@@ -190,7 +190,8 @@ static bool mail_loadmessage(int char_id, int mail_id, struct mail_message* msg)
StringBuf_Destroy(&buf);
Sql_FreeResult(sql_handle);
- ShowDebug("Loaded message (had read flag %d)\n", msg->read);
+ // this thing converts the database value (0,1,2) into a boolean yes/no
+ //TODO: provide decent enum instead of using 'magic' values
if (msg->read == 1)
{
msg->read = 0;
@@ -374,7 +375,8 @@ static void mapif_Mail_send(int fd, struct mail_message* msg)
static void mapif_parse_Mail_send(int fd)
{
struct mail_message msg;
- int mail_id = 0, account_id = 0;
+ char esc_name[NAME_LENGTH*2+1];
+ int account_id = 0;
if(RFIFOW(fd,2) != 8 + sizeof(struct mail_message))
return;
@@ -383,32 +385,28 @@ static void mapif_parse_Mail_send(int fd)
account_id = RFIFOL(fd,4);
- if( !msg.dest_id )
+ // Try to find the Dest Char by Name
+ Sql_EscapeStringLen(sql_handle, esc_name, msg.dest_name, strnlen(msg.dest_name, NAME_LENGTH));
+ if ( SQL_ERROR == Sql_Query(sql_handle, "SELECT `account_id`, `char_id` FROM `%s` WHERE `name` = '%s'", char_db, esc_name) )
+ Sql_ShowDebug(sql_handle);
+ else
+ if ( SQL_SUCCESS == Sql_NextRow(sql_handle) )
{
- // Try to find the Dest Char by Name
- char esc_name[NAME_LENGTH*2+1];
-
- Sql_EscapeStringLen(sql_handle, esc_name, msg.dest_name, strnlen(msg.dest_name, NAME_LENGTH));
- if ( SQL_ERROR == Sql_Query(sql_handle, "SELECT `account_id`, `char_id` FROM `%s` WHERE `name` = '%s'", char_db, esc_name) )
- Sql_ShowDebug(sql_handle);
- else
- if ( SQL_SUCCESS == Sql_NextRow(sql_handle) )
- {
- char *data;
- Sql_GetData(sql_handle, 0, &data, NULL);
- if (atoi(data) != account_id)
- { // Cannot send mail to char in the same account
- Sql_GetData(sql_handle, 1, &data, NULL);
- msg.dest_id = atoi(data);
- }
+ char *data;
+ Sql_GetData(sql_handle, 0, &data, NULL);
+ if (atoi(data) != account_id)
+ { // Cannot send mail to char in the same account
+ Sql_GetData(sql_handle, 1, &data, NULL);
+ msg.dest_id = atoi(data);
}
- Sql_FreeResult(sql_handle);
}
+ Sql_FreeResult(sql_handle);
if( msg.dest_id > 0 )
- mail_id = mail_savemessage(&msg);
+ msg.id = mail_savemessage(&msg);
+ else
+ msg.id = 0;
- msg.id = mail_id;
mapif_Mail_send(fd, &msg);
}
diff --git a/src/map/clif.c b/src/map/clif.c
index 3b2fefc1c..0d0aa997b 100644
--- a/src/map/clif.c
+++ b/src/map/clif.c
@@ -11465,7 +11465,10 @@ void clif_parse_Mail_getattach(int fd, struct map_session_data *sd)
weight = data->weight * sd->mail.inbox.msg[i].item.amount;
if (weight > sd->max_weight - sd->weight)
{
- clif_displaymessage(fd, "Attachment to heavy for you...");
+ WFIFOHEAD(fd,packet_len(0x245));
+ WFIFOW(fd,0) = 0x245;
+ WFIFOB(fd,2) = 2;
+ WFIFOSET(fd,packet_len(0x245));
return;
}
}
@@ -11635,7 +11638,6 @@ void clif_Mail_send(int fd, unsigned char flag)
/// S 0248 <packet len>.w <nick>.24B <title>.40B <body len>.B <message>.?B
void clif_parse_Mail_send(int fd, struct map_session_data *sd)
{
- struct map_session_data *rd;
struct mail_message msg;
int body_len;
nullpo_retv(sd);
@@ -11653,14 +11655,6 @@ void clif_parse_Mail_send(int fd, struct map_session_data *sd)
}
body_len = RFIFOB(fd,68);
- rd = map_nick2sd_nocase(RFIFOP(fd,4));
-
- if (rd && rd == sd) {
- clif_Mail_send(fd, 1);
- mail_removeitem(sd,0);
- mail_removezeny(sd,0);
- return;
- }
if (body_len > MAIL_BODY_LENGTH)
body_len = MAIL_BODY_LENGTH;
@@ -11674,16 +11668,9 @@ void clif_parse_Mail_send(int fd, struct map_session_data *sd)
}
msg.send_id = sd->status.char_id;
+ msg.dest_id = 0; // will attempt to resolve name
safestrncpy(msg.send_name, sd->status.name, NAME_LENGTH);
-
- if (rd) {
- msg.dest_id = rd->status.char_id;
- safestrncpy(msg.dest_name, rd->status.name, NAME_LENGTH);
- } else {
- msg.dest_id = 0;
- safestrncpy(msg.dest_name, (char*)RFIFOP(fd,4), NAME_LENGTH);
- }
-
+ safestrncpy(msg.dest_name, (char*)RFIFOP(fd,4), NAME_LENGTH);
safestrncpy(msg.title, (char*)RFIFOP(fd,28), MAIL_TITLE_LENGTH);
if (body_len)
diff --git a/src/map/intif.c b/src/map/intif.c
index d6839b180..702ab244a 100644
--- a/src/map/intif.c
+++ b/src/map/intif.c
@@ -1669,44 +1669,46 @@ int intif_Mail_send(int account_id, struct mail_message *msg)
int intif_parse_Mail_send(int fd)
{
- struct map_session_data *sd = map_charid2sd(RFIFOL(fd,4));
+ struct map_session_data* sd = map_charid2sd(RFIFOL(fd,4));
int mail_id = RFIFOL(fd,8);
int dest_id = RFIFOL(fd,12);
+ struct map_session_data* rd;
- if (sd == NULL && mail_id > 0)
- {
- if (battle_config.error_log)
+ if( mail_id == 0 )
+ {// nick->charid lookup failed, no such char
+ // Return the items to the owner
+ mail_removeitem(sd, 0);
+ mail_removezeny(sd, 0);
+ clif_Mail_send(sd->fd, 1); // failed
+ return 0;
+ }
+
+ if( sd == NULL )
+ {// original sender disconnected, item cannot be deleted!
+ if( battle_config.error_log )
ShowError("intif_parse_Mail_send: char not found %d\n",RFIFOL(fd,2));
- // If sd = NULL attachment haven't been removed from sender inventory.
+ // the best thing we can do at this point is requesting removal of the mail with the duped item
intif_Mail_delete(dest_id, mail_id);
return 0;
}
- if (mail_id > 0)
+ // physically delete the item
+ mail_removeitem(sd, 1);
+ mail_removezeny(sd, 1);
+ clif_Mail_send(sd->fd, 0); // success
+
+ // notify recipient about new mail
+ rd = map_charid2sd(dest_id);
+ if( rd != NULL )
{
- struct map_session_data *rd = map_charid2sd(dest_id);
-
- mail_removeitem(sd, 1);
- mail_removezeny(sd, 1);
-
- if (rd != NULL)
- {
- char title[MAIL_TITLE_LENGTH];
- memcpy(title, RFIFOP(fd,16), RFIFOW(fd,2) - 16);
-
- rd->mail.inbox.changed = 1;
- clif_Mail_new(rd->fd, mail_id, sd->status.name, title);
- }
- }
- else
- { // Return the items to the owner
- mail_removeitem(sd, 0);
- mail_removezeny(sd, 0);
+ char title[MAIL_TITLE_LENGTH];
+ memcpy(title, RFIFOP(fd,16), RFIFOW(fd,2) - 16);
+
+ rd->mail.inbox.changed = 1;
+ clif_Mail_new(rd->fd, mail_id, sd->status.name, title);
}
- clif_Mail_send(sd->fd, (mail_id > 0)?0:1);
-
return 0;
}
diff --git a/src/map/map.c b/src/map/map.c
index 43a05810c..fd50012e4 100644
--- a/src/map/map.c
+++ b/src/map/map.c
@@ -1847,21 +1847,6 @@ struct map_session_data * map_nick2sd(const char *nick)
return NULL;
}
-struct map_session_data * map_nick2sd_nocase(const char *nick)
-{
- int i, users;
- struct map_session_data **pl_allsd;
-
- pl_allsd = map_getallusers(&users);
- for (i = 0; i < users; i++)
- {
- if ( !strcmp(pl_allsd[i]->status.name, nick) )
- return pl_allsd[i];
- }
-
- return NULL;
-}
-
/*==========================================
* id番?の物を探す
* 一三bjectの場合は配列を引くのみ
diff --git a/src/map/map.h b/src/map/map.h
index 896af5507..cb866bbb8 100644
--- a/src/map/map.h
+++ b/src/map/map.h
@@ -1344,7 +1344,6 @@ struct map_session_data** map_getallusers(int *users);
void map_foreachpc(int (*func)(DBKey,void*,va_list),...);
int map_foreachiddb(int (*)(DBKey,void*,va_list),...);
struct map_session_data * map_nick2sd(const char*);
-struct map_session_data * map_nick2sd_nocase(const char *);
// その他
int map_check_dir(int s_dir,int t_dir);