Mon, 12 May 2025 20:25:16 -0500
Handle formatting in server messages
Testing Done:
Used the default motd on my local ergo server to verify that formatting was working.
Reviewed at https://reviews.imfreedom.org/r/3991/
purple_coresources = [ 'accounts.c', 'circularbuffer.c', 'core.c', 'debug.c', 'image.c', 'network.c', 'plugins.c', 'prefs.c', 'proxy.c', 'purpleaccount.c', 'purpleaccountmanager.c', 'purpleaccountoption.c', 'purpleaccountusersplit.c', 'purpleaddcontactrequest.c', 'purpleattachment.c', 'purpleattachments.c', 'purpleauthorizationrequest.c', 'purpleavatar.c', 'purplebadge.c', 'purplebadgemanager.c', 'purplebadges.c', 'purplechanneljoindetails.c', 'purplecommand.c', 'purplecommands.c', 'purplecommandmanager.c', 'purpleconnection.c', 'purplecontact.c', 'purplecontactinfo.c', 'purplecontactmanager.c', 'purpleconversation.c', 'purpleconversationmanager.c', 'purpleconversationmember.c', 'purpleconversationmembers.c', 'purplecreateconversationdetails.c', 'purplecredentialmanager.c', 'purplecredentialprovider.c', 'purpledebugui.c', 'purplefiletransfer.c', 'purplefiletransfermanager.c', 'purplegdkpixbuf.c', 'purplegio.c', 'purplehistoryadapter.c', 'purplehistorymanager.c', 'purpleidlemanager.c', 'purplekeyvaluepair.c', 'purplemarkup.c', 'purplemenu.c', 'purplemessage.c', 'purplemessages.c', 'purplenoopcredentialprovider.c', 'purplenotification.c', 'purplenotificationaddcontact.c', 'purplenotificationauthorizationrequest.c', 'purplenotificationconnectionerror.c', 'purplenotificationlink.c', 'purplenotificationmanager.c', 'purpleoptions.c', 'purplepath.c', 'purpleperson.c', 'purpleplugininfo.c', 'purplepresence.c', 'purplepresencemanager.c', 'purpleprotocol.c', 'purpleprotocolcontacts.c', 'purpleprotocolconversation.c', 'purpleprotocolfiletransfer.c', 'purpleprotocolmanager.c', 'purpleprotocolroster.c', 'purpleprotocolwhiteboard.c', 'purpleproxyinfo.c', 'purplesavedpresence.c', 'purplesqlitehistoryadapter.c', 'purpletags.c', 'purpleui.c', 'purpleversion.c', 'purplewhiteboard.c', 'purplewhiteboardmanager.c', 'purplewhiteboarduiops.c', 'request.c', 'request/purplerequestfield.c', 'request/purplerequestfieldaccount.c', 'request/purplerequestfieldbool.c', 'request/purplerequestfieldchoice.c', 'request/purplerequestfieldimage.c', 'request/purplerequestfieldint.c', 'request/purplerequestfieldlabel.c', 'request/purplerequestfieldlist.c', 'request/purplerequestfieldstring.c', 'request/purplerequestgroup.c', 'request/purplerequestpage.c', 'util.c', 'xmlnode.c' ] purple_coreheaders = [ 'accounts.h', 'circularbuffer.h', 'core.h', 'debug.h', 'image.h', 'network.h', 'plugins.h', 'prefs.h', 'proxy.h', 'purpleaccount.h', 'purpleaccountmanager.h', 'purpleaccountoption.h', 'purpleaccountusersplit.h', 'purpleaddcontactrequest.h', 'purpleattachment.h', 'purpleattachments.h', 'purpleauthorizationrequest.h', 'purpleavatar.h', 'purplebadge.h', 'purplebadgemanager.h', 'purplebadges.h', 'purplechanneljoindetails.h', 'purplecommand.h', 'purplecommands.h', 'purplecommandmanager.h', 'purpleconnection.h', 'purplecontact.h', 'purplecontactinfo.h', 'purplecontactmanager.h', 'purpleconversation.h', 'purpleconversationmanager.h', 'purpleconversationmember.h', 'purpleconversationmembers.h', 'purplecreateconversationdetails.h', 'purplecredentialmanager.h', 'purplecredentialprovider.h', 'purpledebugui.h', 'purplefiletransfer.h', 'purplefiletransfermanager.h', 'purplegdkpixbuf.h', 'purplegio.h', 'purplehistoryadapter.h', 'purplehistorymanager.h', 'purpleidlemanager.h', 'purplekeyvaluepair.h', 'purplemarkup.h', 'purplemenu.h', 'purplemessage.h', 'purplemessages.h', 'purplenoopcredentialprovider.h', 'purplenotification.h', 'purplenotificationaddcontact.h', 'purplenotificationauthorizationrequest.h', 'purplenotificationconnectionerror.h', 'purplenotificationlink.h', 'purplenotificationmanager.h', 'purpleoptions.h', 'purplepath.h', 'purpleperson.h', 'purpleplugininfo.h', 'purplepresence.h', 'purplepresencemanager.h', 'purpleprotocol.h', 'purpleprotocolcontacts.h', 'purpleprotocolconversation.h', 'purpleprotocolfiletransfer.h', 'purpleprotocolmanager.h', 'purpleprotocolroster.h', 'purpleprotocolwhiteboard.h', 'purpleproxyinfo.h', 'purplesavedpresence.h', 'purplesqlitehistoryadapter.h', 'purpletags.h', 'purpletyping.h', 'purpleui.h', 'purpleversion.h', 'purplewhiteboard.h', 'purplewhiteboardmanager.h', 'purplewhiteboardops.h', 'purplewhiteboarduiops.h', 'request.h', 'util.h', 'xmlnode.h', ] purple_private_headers = [ 'purpleaccountprivate.h', 'purpleaccountmanagerprivate.h', 'purplecommandmanagerprivate.h', 'purplecontactmanagerprivate.h', 'purpleconversationmanagerprivate.h', 'purplecredentialmanagerprivate.h', 'purplecredentialproviderprivate.h', 'purplefiletransfermanagerprivate.h', 'purplehistoryadapterprivate.h', 'purpleidlemanagerprivate.h', 'purplenotificationmanagerprivate.h', 'purplepresencemanagerprivate.h', 'purpleprotocolmanagerprivate.h', 'purplewhiteboardmanagerprivate.h', ] purple_request_headers = [ 'request/purplerequestfield.h', 'request/purplerequestfieldaccount.h', 'request/purplerequestfieldbool.h', 'request/purplerequestfieldchoice.h', 'request/purplerequestfieldimage.h', 'request/purplerequestfieldint.h', 'request/purplerequestfieldlabel.h', 'request/purplerequestfieldlist.h', 'request/purplerequestfieldstring.h', 'request/purplerequestgroup.h', 'request/purplerequestpage.h', ] purple_builtsources = [] purple_builtheaders = [] purple_generated_sources = [] # An environment for unit tests. testenv = environment() purple_resource = gnome.compile_resources('purpleresources', 'resources/libpurple.gresource.xml', source_dir : 'resources', c_name : 'purple') purple_builtsources += purple_resource purple_filebase = f'purple-@purple_api_major_version@' purple_include_base = purple_filebase / 'libpurple' if IS_WIN32 purple_coresources += [ 'win32/libc_interface.c', 'win32/win32dep.c' ] purple_coreheaders += [ 'win32/win32dep.h', ] libpurplerc = configure_file( input : 'win32/libpurplerc.rc.in', output : 'libpurplerc.rc', configuration : version_conf) purple_coresources += windows.compile_resources(libpurplerc) endif purple_enumheaders = [ 'debug.h', 'plugins.h', 'purpleaccount.h', 'purpleconnection.h', 'purplecontactinfo.h', 'purpleconversation.h', 'purplecreateconversationdetails.h', 'purplefiletransfer.h', 'purpleplugininfo.h', 'purplepresence.h', 'purpleprotocol.h', 'purpleproxyinfo.h', 'purpletyping.h', 'xmlnode.h' ] enums = gnome.mkenums_simple('purpleenums', sources : purple_enumheaders, decorator : '_PURPLE_EXTERN', header_prefix : '#include "purpleversion.h"', install_header : true, install_dir : get_option('includedir') / purple_include_base) enums_c = enums[0] enums_h = enums[1] PURPLE_H_INCLUDES = [] foreach header : purple_coreheaders + purple_request_headers + ['purpleversionconsts.h', 'purpleenums.h'] PURPLE_H_INCLUDES += f'#include <libpurple/@header@>' endforeach purple_h_conf = configuration_data() purple_h_conf.set('PURPLE_H_INCLUDES', '\n'.join(PURPLE_H_INCLUDES)) purple_h = configure_file(input : 'purple.h.in', output : 'purple.h', configuration : purple_h_conf, install : true, install_dir : get_option('includedir') / purple_filebase) version_h = configure_file(input : 'purpleversionconsts.h.in', output : 'purpleversionconsts.h', configuration : version_conf, install : true, install_dir : get_option('includedir') / purple_include_base) purple_builtsources += enums_c purple_builtheaders += [ purple_h, version_h, enums_h, ] subdir('data') libpurple_inc = include_directories('.') libpurple = library('purple3', purple_coresources + purple_builtsources + purple_builtheaders + purple_schemas + purple_private_headers + ['glibcompat.h'], c_args : ['-DPURPLE_COMPILATION', '-DG_LOG_USE_STRUCTURED', '-DG_LOG_DOMAIN="Purple"'], gnu_symbol_visibility : 'hidden', include_directories : [toplevel_inc, libpurple_inc], install : true, version : PURPLE_LIB_VERSION, dependencies : # static_link_libs [dnsapi, ws2_32, glib, gio, gplugin_dep, libsoup, libxml, gdk_pixbuf, gstreamer, gstreamer_app, json, pango_dep, seagull_dep, sqlite3, math, birb_dep]) install_headers(purple_coreheaders, subdir : purple_include_base) install_headers(purple_request_headers, subdir : purple_include_base / 'request') pkgconfig.generate( libpurple, name : 'libpurple3', description : 'libpurple3 is a GLib-based instant messenger library.', version : meson.project_version(), filebase : purple_filebase, # TODO: Only use purple_filebase once everything is ported to only use purple.h subdirs : [purple_filebase, purple_include_base], libraries : [glib, gdk_pixbuf, gplugin_dep], variables : [ f'plugindir=${libdir}/@purple_filebase@', ]) if enable_introspection introspection_sources = (purple_coresources + purple_coreheaders + purple_builtheaders + purple_request_headers) libpurple_gir = gnome.generate_gir(libpurple, sources : introspection_sources, includes : ['Birb-1.0', 'GdkPixbuf-2.0', 'GLib-2.0', 'Gio-2.0', 'GObject-2.0', 'Gst-1.0', 'GPlugin-1.0', 'Pango-1.0'], header : 'purple.h', namespace : 'Purple', symbol_prefix : 'purple', identifier_prefix : 'Purple', export_packages : purple_filebase, nsversion : f'@purple_api_major_version@.@purple_api_minor_version@', dependencies: [birb_dep, gplugin_dep], install : true, extra_args : ['-DPURPLE_COMPILATION', '--quiet']) purple_generated_sources += libpurple_gir endif libpurple_dep = declare_dependency( # Ensure purple headers built before any dependencies: sources : [purple_builtheaders] + purple_generated_sources, include_directories : [toplevel_inc, libpurple_inc], link_with : libpurple, dependencies : [birb_dep, gdk_pixbuf, gstreamer, gplugin_dep, glib, gio, pango_dep]) meson.override_dependency(purple_filebase, libpurple_dep) subdir('tests') subdir('plugins') subdir('reference') test( 'purple_license_headers', check_license_header, verbose : true, args : [ meson.current_source_dir(), 'check_license_header_template.h', 'glibcompat.h', 'purple.h.in', 'purpleversionconsts.h.in', purple_coresources, purple_coreheaders, purple_private_headers, purple_request_headers, ] )