@@ -184,6 +184,9 @@ hjs_util_datefromtime (JSContext *context, time_t time)
184184 jsval date_prototype;
185185 jsval args[1 ];
186186
187+ if (time == 0 )
188+ return JSVAL_VOID ;
189+
187190 if (!JS_EnterLocalRootScope (context))
188191 return JSVAL_VOID ;
189192
@@ -204,6 +207,20 @@ hjs_util_datefromtime (JSContext *context, time_t time)
204207 return OBJECT_TO_JSVAL (date);
205208}
206209
210+ static time_t
211+ hjs_util_timefromdate (JSContext *context, JSObject *date)
212+ {
213+ jsval retval;
214+
215+ if (!JS_CallFunctionName (context, date, " getTime" , 0 , nullptr , &retval))
216+ return (time_t )(-1 );
217+
218+ if (JSVAL_IS_INT (retval))
219+ return (time_t )(JSVAL_TO_INT (retval));
220+
221+ return (time_t )(-1 );
222+ }
223+
207224
208225/* script functions */
209226
@@ -420,6 +437,27 @@ hjs_print_error (JSContext* context, const char* message, JSErrorReport* report)
420437
421438/* callback functions for hooks */
422439
440+ static int
441+ hjs_callback (char * word[], char * word_eol[], hexchat_event_attrs *attrs, void *hook) // server
442+ {
443+ JSContext* context = ((script_hook*)hook)->context ;
444+ JSFunction* fun = JS_ValueToFunction (context, OBJECT_TO_JSVAL (((script_hook*)hook)->callback ));
445+ jsval argv[4 ];
446+ jsval rval = JSVAL_VOID ;
447+
448+ argv[0 ] = hjs_util_buildword (context, word+1 );
449+ argv[1 ] = hjs_util_buildword (context, word_eol+1 );
450+ argv[2 ] = hjs_util_datefromtime (context, attrs->server_time_utc );
451+ argv[3 ] = OBJECT_TO_JSVAL (((script_hook*)hook)->userdata );
452+
453+ JS_CallFunction (context, JS_GetGlobalForScopeChain (context), fun, 4 , argv, &rval);
454+
455+ if (JSVAL_IS_VOID (rval))
456+ return HEXCHAT_EAT_NONE ;
457+ else
458+ return JSVAL_TO_INT (rval);
459+ }
460+
423461static int
424462hjs_callback (char * word[], char * word_eol[], void *hook) // command
425463{
@@ -441,17 +479,18 @@ hjs_callback (char* word[], char* word_eol[], void *hook) // command
441479}
442480
443481static int
444- hjs_callback (char * word[], void *hook) // server and print
482+ hjs_callback (char * word[], hexchat_event_attrs *attrs, void *hook) // server and print
445483{
446484 JSContext* context = ((script_hook*)hook)->context ;
447485 JSFunction* fun = JS_ValueToFunction (context, OBJECT_TO_JSVAL (((script_hook*)hook)->callback ));
448- jsval argv[2 ];
486+ jsval argv[3 ];
449487 jsval rval = JSVAL_VOID ;
450488
451489 argv[0 ] = hjs_util_buildword (context, word+1 );
452- argv[1 ] = OBJECT_TO_JSVAL (((script_hook*)hook)->userdata );
490+ argv[1 ] = hjs_util_datefromtime (context, attrs->server_time_utc );
491+ argv[2 ] = OBJECT_TO_JSVAL (((script_hook*)hook)->userdata );
453492
454- JS_CallFunction (context, JS_GetGlobalForScopeChain (context), fun, 2 , argv, &rval);
493+ JS_CallFunction (context, JS_GetGlobalForScopeChain (context), fun, 3 , argv, &rval);
455494
456495 if (JSVAL_IS_VOID (rval))
457496 return HEXCHAT_EAT_NONE ;
@@ -509,27 +548,64 @@ hjs_emitprint (JSContext *context, unsigned argc, jsval *vp)
509548 JSString* name;
510549 JSString* args[5 ] = { nullptr };
511550 char * carg[5 ] = { nullptr };
551+ char * cname;
512552 int ret;
513553
514554 if (!JS_ConvertArguments (context, argc, JS_ARGV (context, vp), " S/SSSSS" ,
515555 &name, &args[0 ], &args[1 ], &args[2 ], &args[3 ], &args[4 ]))
516556 return JS_FALSE ;
517557
518558 // convert all jsstrings
519- for (int i = 0 ; i < 5 ; i++)
520- {
521- if (args[i])
522- carg[i] = JSSTRING_TO_CHAR (args[i]);
523- }
559+ for (int i = 0 ; args[i]; i++)
560+ carg[i] = JSSTRING_TO_CHAR (args[i]);
524561
525- ret = hexchat_emit_print (ph, JSSTRING_TO_CHAR (name),
526- carg[0 ], carg[1 ], carg[2 ], carg[3 ], carg[4 ], nullptr );
562+ cname = JSSTRING_TO_CHAR (name);
527563
528- for (int i = 0 ; i < 5 ; i++)
529- {
530- if (carg[i])
531- JS_free (context, carg[i]);
532- }
564+ ret = hexchat_emit_print (ph, cname, carg[0 ], carg[1 ],
565+ carg[2 ], carg[3 ], carg[4 ], nullptr );
566+
567+ JS_free (context, cname);
568+
569+ for (int i = 0 ; carg[i]; i++)
570+ JS_free (context, carg[i]);
571+
572+ JS_SET_RVAL (context, vp, BOOLEAN_TO_JSVAL (ret));
573+
574+ return JS_TRUE ;
575+ }
576+
577+ static JSBool
578+ hjs_emitprintat (JSContext *context, unsigned argc, jsval *vp)
579+ {
580+ JSObject* date;
581+ JSString* name;
582+ JSString* args[5 ] = { nullptr };
583+ char * carg[5 ] = { nullptr };
584+ char * cname;
585+ hexchat_event_attrs* attrs;
586+ int ret;
587+
588+ if (!JS_ConvertArguments (context, argc, JS_ARGV (context, vp), " oS/SSSSS" ,
589+ &date, &name, &args[0 ], &args[1 ], &args[2 ], &args[3 ], &args[4 ]))
590+ return JS_FALSE ;
591+
592+ // convert all jsstrings
593+ for (int i = 0 ; args[i]; i++)
594+ carg[i] = JSSTRING_TO_CHAR (args[i]);
595+
596+ cname = JSSTRING_TO_CHAR (name);
597+
598+ attrs = hexchat_event_attrs_create (ph);
599+ attrs->server_time_utc = hjs_util_timefromdate (context, date);
600+
601+ ret = hexchat_emit_print_attrs (ph, attrs, cname, carg[0 ], carg[1 ],
602+ carg[2 ], carg[3 ], carg[4 ], nullptr );
603+
604+ hexchat_event_attrs_free (ph, attrs);
605+ JS_free (context, cname);
606+
607+ for (int i = 0 ; carg[i]; i++)
608+ JS_free (context, carg[i]);
533609
534610 JS_SET_RVAL (context, vp, BOOLEAN_TO_JSVAL (ret));
535611
@@ -904,7 +980,7 @@ hjs_hookprint (JSContext *context, unsigned argc, jsval *vp)
904980 return JS_FALSE ;
905981
906982 cevent = JSSTRING_TO_CHAR (event);
907- hexhook = hexchat_hook_print (ph, cevent, pri, hjs_callback, hook);
983+ hexhook = hexchat_hook_print_attrs (ph, cevent, pri, hjs_callback, hook);
908984 JS_free (context, cevent);
909985
910986 script->add_hook (hook, HOOK_PRINT , context, funcobj, userdata, hexhook);
@@ -938,7 +1014,7 @@ hjs_hookserver (JSContext *context, unsigned argc, jsval *vp)
9381014 return JS_FALSE ;
9391015
9401016 cserverstr = JSSTRING_TO_CHAR (serverstr);
941- hexhook = hexchat_hook_server (ph, cserverstr, pri, hjs_callback, hook);
1017+ hexhook = hexchat_hook_server_attrs (ph, cserverstr, pri, hjs_callback, hook);
9421018 JS_free (context, cserverstr);
9431019
9441020 script->add_hook (hook, HOOK_SERVER , context, funcobj, userdata, hexhook);
@@ -1173,6 +1249,7 @@ hjs_getpluginpref (JSContext *context, unsigned argc, jsval *vp)
11731249static JSFunctionSpec hexchat_functions[] = {
11741250 {" print" , hjs_print, 1 , JSPROP_READONLY |JSPROP_PERMANENT },
11751251 {" emit_print" , hjs_emitprint, 6 , JSPROP_READONLY |JSPROP_PERMANENT },
1252+ {" emit_print_at" , hjs_emitprintat, 7 , JSPROP_READONLY |JSPROP_PERMANENT },
11761253 {" command" , hjs_command, 1 , JSPROP_READONLY |JSPROP_PERMANENT },
11771254 {" nickcmp" , hjs_nickcmp, 2 , JSPROP_READONLY |JSPROP_PERMANENT },
11781255 {" strip" , hjs_strip, 2 , JSPROP_READONLY |JSPROP_PERMANENT },
0 commit comments