Skip to content

Commit 1cdd9b9

Browse files
committed
add another BATCH for delayed notifications
Based on changes by k4be
1 parent 74a9486 commit 1cdd9b9

File tree

1 file changed

+31
-19
lines changed

1 file changed

+31
-19
lines changed

files/metadata2.c

Lines changed: 31 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -134,9 +134,8 @@ module
134134
MessageTag *mtags = NULL; \
135135
MessageTag *m; \
136136
PUSH_IGNORE_ADDRESS /* -Waddress warns when batch_id is an array */ \
137-
if (!BadPtr(batch_id)) \
137+
if (!BadPtr(batch_id)) { \
138138
POP_IGNORE_ADDRESS \
139-
{ \
140139
mtags = safe_alloc(sizeof(MessageTag)); \
141140
mtags->name = strdup("batch"); \
142141
mtags->value = strdup(batchid); \
@@ -206,7 +205,7 @@ void metadata_send_all_for_user(Client *user, Client *client);
206205
void metadata_sync(Client *client);
207206
int metadata_key_valid(const char *key);
208207
int metadata_check_perms(Client *user, Channel *channel, Client *client, const char *key, int mode);
209-
void metadata_send_change(Client *client, const char *who, const char *key, const char *value, Client *changer);
208+
void metadata_send_change(Client *client, const char *batchid, const char *who, const char *key, const char *value, Client *changer);
210209
int metadata_notify_or_queue(Client *client, const char *who, const char *key, const char *value, Client *changer);
211210

212211
ModDataInfo *metadataUser;
@@ -545,7 +544,7 @@ int metadata_notify_or_queue(Client *client, const char *who, const char *key, c
545544

546545
if (IsSendable(client))
547546
{
548-
metadata_send_change(client, who, key, value, changer);
547+
metadata_send_change(client, NULL, who, key, value, changer);
549548
} else
550549
{ /* store for the SYNC */
551550
Client *who_client;
@@ -572,7 +571,7 @@ int metadata_notify_or_queue(Client *client, const char *who, const char *key, c
572571
return trylater;
573572
}
574573

575-
void metadata_send_change(Client *client, const char *who, const char *key, const char *value, Client *changer)
574+
void metadata_send_change(Client *client, const char *batchid, const char *who, const char *key, const char *value, Client *changer)
576575
{
577576
char *sender = NULL;
578577
if (!key)
@@ -601,16 +600,20 @@ void metadata_send_change(Client *client, const char *who, const char *key, cons
601600
sender = me.name;
602601
if (changer && IsUser(changer) && MyUser(client))
603602
{
604-
if (!value)
605-
sendto_one(client, NULL, ":%s!%s@%s METADATA %s %s %s", sender, changer->user->username, GetHost(changer), who, key, "*");
606-
else
607-
sendto_one(client, NULL, ":%s!%s@%s METADATA %s %s %s :%s", sender, changer->user->username, GetHost(changer), who, key, "*", value);
603+
if (!value) {
604+
batched(sendto_one, client, batchid, ":%s!%s@%s METADATA %s %s %s", sender, changer->user->username, GetHost(changer), who, key, "*");
605+
}
606+
else {
607+
batched(sendto_one, client, batchid, ":%s!%s@%s METADATA %s %s %s :%s", sender, changer->user->username, GetHost(changer), who, key, "*", value);
608+
}
608609
} else
609610
{ /* sending S2S (sender is id) or receiving S2S (sender is servername) */
610-
if (!value)
611-
sendto_one(client, NULL, ":%s METADATA %s %s %s", sender, who, key, "*");
612-
else
613-
sendto_one(client, NULL, ":%s METADATA %s %s %s :%s", sender, who, key, "*", value);
611+
if (!value) {
612+
batched(sendto_one, client, batchid, ":%s METADATA %s %s %s", sender, who, key, "*");
613+
}
614+
else {
615+
batched(sendto_one, client, batchid, ":%s METADATA %s %s %s :%s", sender, who, key, "*", value);
616+
}
614617
}
615618
}
616619

@@ -629,7 +632,7 @@ void user_metadata_changed(Client *user, const char *key, const char *value, Cli
629632
{ /* notifications for linked servers, TODO change to sendto_server */
630633
if (acptr == &me)
631634
continue;
632-
metadata_send_change(acptr, user->name, key, value, changer);
635+
metadata_send_change(acptr, NULL, user->name, key, value, changer);
633636
}
634637
}
635638

@@ -641,14 +644,14 @@ void channel_metadata_changed(Channel *channel, const char *key, const char *val
641644
list_for_each_entry(acptr, &lclient_list, lclient_node)
642645
{ /* notifications for local subscribers */
643646
if (metadata_is_subscribed(acptr, key) && IsMember(acptr, channel))
644-
metadata_send_change(acptr, channel->name, key, value, changer);
647+
metadata_send_change(acptr, NULL, channel->name, key, value, changer);
645648
}
646649

647650
list_for_each_entry(acptr, &server_list, special_node)
648651
{ /* notifications for linked servers, TODO change to sendto_server */
649652
if(acptr == &me)
650653
continue;
651-
metadata_send_change(acptr, channel->name, key, value, changer);
654+
metadata_send_change(acptr, NULL, channel->name, key, value, changer);
652655
}
653656
}
654657

@@ -1332,15 +1335,15 @@ int metadata_server_sync(Client *client)
13321335
if(!moddata)
13331336
continue;
13341337
for (metadata = moddata->metadata; metadata; metadata = metadata->next)
1335-
metadata_send_change(client, acptr->name, metadata->name, metadata->value, &me);
1338+
metadata_send_change(client, NULL, acptr->name, metadata->name, metadata->value, &me);
13361339
}
13371340

13381341
for (hashnum = 0; hashnum < CHAN_HASH_TABLE_SIZE; hashnum++)
13391342
{ /* send out channels */
13401343
for(channel = hash_get_chan_bucket(hashnum); channel; channel = channel->hnextch)
13411344
{
13421345
for(metadata = CHANNEL_METADATA(channel); metadata; metadata = metadata->next)
1343-
metadata_send_change(client, channel->name, metadata->name, metadata->value, &me);
1346+
metadata_send_change(client, NULL, channel->name, metadata->name, metadata->value, &me);
13441347
}
13451348
}
13461349
return 0;
@@ -1392,13 +1395,19 @@ void metadata_sync(Client *client)
13921395
Channel *channel = NULL;
13931396
int do_send = 0;
13941397
char *who;
1398+
char batchid[BATCHLEN+1] = "";
13951399

13961400
struct metadata_moddata_user *my_moddata = USER_METADATA(client);
13971401
if(!my_moddata)
13981402
return; /* nothing queued */
13991403
struct metadata_unsynced *us = my_moddata->us;
14001404
struct metadata_unsynced *prev_us;
14011405

1406+
if (us && HasCapability(client, "batch")) {
1407+
generate_batch_id(batchid);
1408+
sendto_one(client, NULL, ":%s BATCH +%s metadata", me.name, batchid);
1409+
}
1410+
14021411
while (us)
14031412
{
14041413
if (!IsSendable(client))
@@ -1432,7 +1441,7 @@ void metadata_sync(Client *client)
14321441
{ /* has it */
14331442
const char *value = metadata_get_user_key_value(acptr, us->key);
14341443
if(value)
1435-
metadata_send_change(client, us->id, us->key, value, NULL);
1444+
metadata_send_change(client, batchid, us->id, us->key, value, NULL);
14361445
}
14371446
metadata = metadata->next;
14381447
}
@@ -1445,6 +1454,9 @@ void metadata_sync(Client *client)
14451454
safe_free(prev_us);
14461455
my_moddata->us = us; /* we're always removing the first list item */
14471456
}
1457+
if (*batchid)
1458+
sendto_one(client, NULL, ":%s BATCH -%s", me.name, batchid);
1459+
14481460
}
14491461

14501462
int metadata_user_registered(Client *client)

0 commit comments

Comments
 (0)