{"id":31551456,"url":"https://github.com/ppibburr/gi-dino","last_synced_at":"2026-05-18T04:34:28.882Z","repository":{"id":271478807,"uuid":"913593198","full_name":"ppibburr/gi-dino","owner":"ppibburr","description":"GObjectIntropsection capable version of https://github.com/dino/dino","archived":false,"fork":false,"pushed_at":"2025-09-28T01:11:37.000Z","size":26,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-09-28T01:14:42.977Z","etag":null,"topics":["dino","gobject-introspection","ruby","vala","xmpp","xmpp-client"],"latest_commit_sha":null,"homepage":"https://github.com/dino/dino","language":"Ruby","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/ppibburr.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2025-01-08T01:42:21.000Z","updated_at":"2025-09-28T01:11:40.000Z","dependencies_parsed_at":null,"dependency_job_id":"29becf73-ed9d-4a5f-9cfc-9fbb2ca0ba22","html_url":"https://github.com/ppibburr/gi-dino","commit_stats":null,"previous_names":["ppibburr/gi-dino"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/ppibburr/gi-dino","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ppibburr%2Fgi-dino","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ppibburr%2Fgi-dino/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ppibburr%2Fgi-dino/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ppibburr%2Fgi-dino/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/ppibburr","download_url":"https://codeload.github.com/ppibburr/gi-dino/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ppibburr%2Fgi-dino/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":278358488,"owners_count":25973949,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","status":"online","status_checked_at":"2025-10-04T02:00:05.491Z","response_time":63,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["dino","gobject-introspection","ruby","vala","xmpp","xmpp-client"],"created_at":"2025-10-04T18:56:31.150Z","updated_at":"2025-10-04T18:56:34.467Z","avatar_url":"https://github.com/ppibburr.png","language":"Ruby","funding_links":[],"categories":[],"sub_categories":[],"readme":"# gi-dino\n`GObjectIntropsection` capable version of [https://github.com/dino/dino](dino/dino)\n\n# ABOUT\nAllows for creating XMPP libraries and applications using Dino, in any language with GObject-Introspection support  \nThis project converts [https://github.com/dino/dino](dino/dino) into shared libraires that are introspectable  \nEasily develop a full featured and extendable XMPP Audio/Video Call capable client in many languages.  \n# Components\n`libqlite` Dino's sqlite database library  \n`libxmpp-vala` Dino's Xmpp client library  \n`libdino` - the core of [https://github.com/dino/dino](dino/dino) stripped of the application and ui  \n`libdino-ui` - Just enough UI elements for audio/video call window  \n`plugins` (omemo, rtp, ice, etc) - encryption, video/audio calling  \n\n# Note\nTested in Ruby, Python and Vala on debian\n\n# BUILD\n```\nrake help\nrake clone-dino\nrake build\nrake test\nrake install\n```\n\n=== Example (libxmpp-vala in ruby)\n```ruby\nrequire File.expand_path(File.join(File.dirname(__FILE__), \"..\", \"xmpp/lib/xmpp\"))\n\n@loop       = GLib::MainLoop.new\nstanza_node = Xmpp::StanzaNode.new(\"ree\", \"jabber:client\")\n\nstanza_node.add_self_xmlns()\n\nstanza_node[\"bar\"] = \"42\"\n\nfail \"put/get\" unless stanza_node[\"bar\"] == \"42\"\n\nr = Xmpp::StanzaReader.new(str = \"\u003cmessage xmlns='jabber:client' type='chat' to='foo@bar.org'\u003e\u003cbody\u003eree\u003c/body\u003e\u003c/message\u003e\");\n\nr.read_stanza_node do |sr,t,c|\n\n  result = r.read_stanza_node_finish(t).to_xml();\n\n  fail \"read stanza string\" unless result == str\n  \n  @loop.quit\nend\n\n@loop.run\n\n```\n\n=== Example (libdino in ruby)\n```ruby\n#\n# Answer an incoming call (audio/video)!\n#\n\nrequire File.expand_path(File.join(File.dirname(__FILE__), \"..\", \"xmpp/lib/xmpp\"))\nrequire File.expand_path(File.join(File.dirname(__FILE__), \"..\", \"dino/lib/dino\"))\n\nrequire 'gtk4'\n\nclass Example \u003c Gtk::Application\n  type_register\n  \n  include Dino::Application\n\n  attr_accessor :db, :search_path_generator, :settings, :stream_interactor\n  attr_writer   :plugin_registry\n  \n  def plugin_registry\n    @plugin_registry ||= Dino::PluginsRegistry.new()\n  end  \n\n  install_property(GLib::Param::Object.new(\n    \"db\", \"db\", \"db\",\n    Dino::Database.gtype,\n    224 | GLib::Param::READABLE | GLib::Param::WRITABLE\n  ))\n  \n  install_property(GLib::Param::Object.new(\n    \"search-path-generator\",\"Search Path Generator\",\"sp sp\",\n    Dino::SearchPathGenerator,\n    224 | GLib::Param::READABLE | GLib::Param::WRITABLE\n  ))\n  \n  install_property(GLib::Param::Object.new(\n    \"settings\",\"Settings\",\"s s\",\n    Dino::EntitiesSettings,\n    224 | GLib::Param::READABLE | GLib::Param::WRITABLE\n  ))\n  \n  install_property(GLib::Param::Object.new(\n    \"plugin-registry\",\"Plugin_registry\",\"p p\",\n    Dino::PluginsRegistry,\n    224 | GLib::Param::READABLE | GLib::Param::WRITABLE\n  ))\n  \n  install_property(GLib::Param::Object.new(\n    \"stream-interactor\",\"Stream IOnteracxtore\",\"si p\",\n    Dino::StreamInteractor,\n    224 | GLib::Param::READABLE | GLib::Param::WRITABLE\n  ))    \n  \n  def initialize(app_id=\"im.dino.GIDino\")\n    super application_id: app_id, flags: :handles_open\n    \n    @search_path = ENV['SEARCH_PATH'] || \"./git/dino/build/plugins\"\n    self.search_path_generator = Dino::SearchPathGenerator.new(@search_path);\n\n    init();\n    \n    signal_connect :activate do \n      user = ARGV[1]\n      \n      acct = db.accounts.find do |a|\n        a.bare_jid.to_s == user\n      end\n      \n      acct ||= Dino::EntitiesAccount.new(Xmpp::Jid.new(user), ARGV[3]);\n\t  \n      # Enable the account\n      acct.enabled = true;\n      # Persist the account\n      acct.persist(db);\n      \n      # Send a message once user account connects\n      stream_interactor.signal_connect :stream_negotiated do |si, a,s|\n        next unless a.bare_jid.to_s == user\n      \n        # send message to +jid+\n        jid = 'admin@pbr69.hopto.me'\n        msg = \u003c\u003c~EOM\n          lol NVM bud.\n        EOM\n        \n        c = db.get_conversations(a).find do |c_|\n          c_.counterpart.bare_jid.to_s == jid\n        end\n    \n        c ||= Dino::EntitiesConversation.new(Xmpp::Jid.new(jid), account, ct); \n      \n        c.encryption = Dino::EntitiesEncryption::OMEMO\n\n        Dino.send_message(c, msg, 0, nil, Xmpp.xep_message_markup_get_spans(Xmpp::MessageStanza.new));\n      end\n      \n      # Gonna answer the call when they call us after getting our message\n      # Will pop up a call window\n      calls = stream_interactor.interaction_modules.find do |m|\n        m.gtype == (Dino::Calls.gtype)\n      end\n      \n      calls.signal_connect :call_incoming do |_,call, state, conversation, video,multiparty|\n        state.accept();\n\n        call_window            = DinoUI::UiCallWindow.new();\n        call_window.controller = DinoUI::UiCallWindowController.new(call_window, state, stream_interactor);\n        \n        call_window.present();\n      end\n      \n      mp=stream_interactor.interaction_modules.find do |m|\n        m.gtype == (Dino::MessageProcessor.gtype)\n      end\n      \n      mp.signal_connect(:message_received) do |_,m,c|\n        puts message: m.body, from: m.counterpart.to_s\n      end\n      \n      hold()\n    end\n  \n    loader = Dino::PluginsLoader.new(self);\n    loader.load_all(); \n  end\nend\n\nExample.new.run\n\n\n```\n\n=== Vala\n\n```\nvalac sample/dino.vala \\\n    --pkg gio-2.0 --pkg DinoUI-0.1 --pkg Dino-0.1 --pkg Xmpp-0.1 --pkg gee-0.8 \\\n    --pkg Qlite-0.1 --pkg gtk4 -X -I/usr/include/gi-dino -X -ldino \\\n    -o sample/bin/dino -X -fPIC\n```\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fppibburr%2Fgi-dino","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fppibburr%2Fgi-dino","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fppibburr%2Fgi-dino/lists"}