@@ -134,9 +134,8 @@ module
134
134
MessageTag *mtags = NULL; \
135
135
MessageTag *m; \
136
136
PUSH_IGNORE_ADDRESS /* -Waddress warns when batch_id is an array */ \
137
- if (!BadPtr (batch_id )) \
137
+ if (!BadPtr (batch_id )) { \
138
138
POP_IGNORE_ADDRESS \
139
- { \
140
139
mtags = safe_alloc (sizeof (MessageTag )); \
141
140
mtags -> name = strdup ("batch" ); \
142
141
mtags -> value = strdup (batchid ); \
@@ -206,7 +205,7 @@ void metadata_send_all_for_user(Client *user, Client *client);
206
205
void metadata_sync (Client * client );
207
206
int metadata_key_valid (const char * key );
208
207
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 );
210
209
int metadata_notify_or_queue (Client * client , const char * who , const char * key , const char * value , Client * changer );
211
210
212
211
ModDataInfo * metadataUser ;
@@ -545,7 +544,7 @@ int metadata_notify_or_queue(Client *client, const char *who, const char *key, c
545
544
546
545
if (IsSendable (client ))
547
546
{
548
- metadata_send_change (client , who , key , value , changer );
547
+ metadata_send_change (client , NULL , who , key , value , changer );
549
548
} else
550
549
{ /* store for the SYNC */
551
550
Client * who_client ;
@@ -572,7 +571,7 @@ int metadata_notify_or_queue(Client *client, const char *who, const char *key, c
572
571
return trylater ;
573
572
}
574
573
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 )
576
575
{
577
576
char * sender = NULL ;
578
577
if (!key )
@@ -601,16 +600,20 @@ void metadata_send_change(Client *client, const char *who, const char *key, cons
601
600
sender = me .name ;
602
601
if (changer && IsUser (changer ) && MyUser (client ))
603
602
{
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
+ }
608
609
} else
609
610
{ /* 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
+ }
614
617
}
615
618
}
616
619
@@ -629,7 +632,7 @@ void user_metadata_changed(Client *user, const char *key, const char *value, Cli
629
632
{ /* notifications for linked servers, TODO change to sendto_server */
630
633
if (acptr == & me )
631
634
continue ;
632
- metadata_send_change (acptr , user -> name , key , value , changer );
635
+ metadata_send_change (acptr , NULL , user -> name , key , value , changer );
633
636
}
634
637
}
635
638
@@ -641,14 +644,14 @@ void channel_metadata_changed(Channel *channel, const char *key, const char *val
641
644
list_for_each_entry (acptr , & lclient_list , lclient_node )
642
645
{ /* notifications for local subscribers */
643
646
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 );
645
648
}
646
649
647
650
list_for_each_entry (acptr , & server_list , special_node )
648
651
{ /* notifications for linked servers, TODO change to sendto_server */
649
652
if (acptr == & me )
650
653
continue ;
651
- metadata_send_change (acptr , channel -> name , key , value , changer );
654
+ metadata_send_change (acptr , NULL , channel -> name , key , value , changer );
652
655
}
653
656
}
654
657
@@ -1332,15 +1335,15 @@ int metadata_server_sync(Client *client)
1332
1335
if (!moddata )
1333
1336
continue ;
1334
1337
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 );
1336
1339
}
1337
1340
1338
1341
for (hashnum = 0 ; hashnum < CHAN_HASH_TABLE_SIZE ; hashnum ++ )
1339
1342
{ /* send out channels */
1340
1343
for (channel = hash_get_chan_bucket (hashnum ); channel ; channel = channel -> hnextch )
1341
1344
{
1342
1345
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 );
1344
1347
}
1345
1348
}
1346
1349
return 0 ;
@@ -1392,13 +1395,19 @@ void metadata_sync(Client *client)
1392
1395
Channel * channel = NULL ;
1393
1396
int do_send = 0 ;
1394
1397
char * who ;
1398
+ char batchid [BATCHLEN + 1 ] = "" ;
1395
1399
1396
1400
struct metadata_moddata_user * my_moddata = USER_METADATA (client );
1397
1401
if (!my_moddata )
1398
1402
return ; /* nothing queued */
1399
1403
struct metadata_unsynced * us = my_moddata -> us ;
1400
1404
struct metadata_unsynced * prev_us ;
1401
1405
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
+
1402
1411
while (us )
1403
1412
{
1404
1413
if (!IsSendable (client ))
@@ -1432,7 +1441,7 @@ void metadata_sync(Client *client)
1432
1441
{ /* has it */
1433
1442
const char * value = metadata_get_user_key_value (acptr , us -> key );
1434
1443
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 );
1436
1445
}
1437
1446
metadata = metadata -> next ;
1438
1447
}
@@ -1445,6 +1454,9 @@ void metadata_sync(Client *client)
1445
1454
safe_free (prev_us );
1446
1455
my_moddata -> us = us ; /* we're always removing the first list item */
1447
1456
}
1457
+ if (* batchid )
1458
+ sendto_one (client , NULL , ":%s BATCH -%s" , me .name , batchid );
1459
+
1448
1460
}
1449
1461
1450
1462
int metadata_user_registered (Client * client )
0 commit comments