commit 712151b0eab1e6baccb35444d2924a9e535f4f45 Author: Christian Basler Date: Sat Jun 25 12:52:19 2016 +0200 Initial project site, there's a lot to do still diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..45c1505 --- /dev/null +++ b/.gitignore @@ -0,0 +1,3 @@ +_site +.sass-cache +.jekyll-metadata diff --git a/_config.yml b/_config.yml new file mode 100644 index 0000000..c150081 --- /dev/null +++ b/_config.yml @@ -0,0 +1,20 @@ +# Welcome to Jekyll! +# +# This config file is meant for settings that affect your whole blog, values +# which you are expected to set up once and rarely need to edit after that. +# For technical reasons, this file is *NOT* reloaded automatically when you use +# 'jekyll serve'. If you change this file, please restart the server process. + +# Site settings +title: Jabit +email: chrigu.meyer@gmail.com +description: > # this means to ignore newlines until "baseurl:" + You want to create an awesome Bitmessage app using Jabit? Then you've come + to the right place! +baseurl: "" # the subpath of your site, e.g. /blog +url: "http://dissem.github.io/Jabit" # the base hostname & protocol for your site +# twitter_username: jekyllrb +github_username: Dissem + +# Build settings +markdown: kramdown diff --git a/_drafts/2016-06-22-project-setup.markdown b/_drafts/2016-06-22-project-setup.markdown new file mode 100644 index 0000000..88fab6e --- /dev/null +++ b/_drafts/2016-06-22-project-setup.markdown @@ -0,0 +1,29 @@ +--- +layout: post +title: "Setting up Jabit for Your Project" +date: 2016-06-22 00:01:00 +0200 +categories: setup +--- + +Add Jabit as Gradle dependency: + +{% highlight groovy %} +compile 'ch.dissem.jabit:jabit-core:1.0.0' +{% endhighlight %} + +Unless you want to implement your own, also add the following: + +{% highlight groovy %} +compile 'ch.dissem.jabit:jabit-networking:1.0.0' +compile 'ch.dissem.jabit:jabit-repositories:1.0.0' +compile 'ch.dissem.jabit:jabit-cryptography-bouncy:1.0.0' +{% endhighlight %} + +And if you want to import from or export to the Wallet Import Format (used by PyBitmessage) you might also want to add: + +{% highlight groovy %} +compile 'ch.dissem.jabit:jabit-wif:1.0.0' +{% endhighlight %} + +For Android clients use `jabit-cryptography-spongy` instead of `jabit-cryptography-bouncy`. + diff --git a/_drafts/2016-06-22-using-the-api.markdown b/_drafts/2016-06-22-using-the-api.markdown new file mode 100644 index 0000000..47d5a91 --- /dev/null +++ b/_drafts/2016-06-22-using-the-api.markdown @@ -0,0 +1,54 @@ +--- +layout: post +title: "Using the Jabit API" +date: 2016-06-22 00:02:00 +0200 +categories: setup +--- + +### Usage + +First, you'll need to create a `BitmessageContext`: + +{% highlight java %} +JdbcConfig jdbcConfig = new JdbcConfig(); +BitmessageContext ctx = new BitmessageContext.Builder() + .addressRepo(new JdbcAddressRepository(jdbcConfig)) + .inventory(new JdbcInventory(jdbcConfig)) + .messageRepo(new JdbcMessageRepository(jdbcConfig)) + .nodeRegistry(new MemoryNodeRegistry()) + .networkHandler(new NetworkNode()) + .cryptography(new BouncyCryptography()) + .build(); +{% endhighlight %} + +This creates a simple context using a H2 database that will be created in the user's home directory. Next you'll need to +start the context and decide what happens if a message arrives: + +{% highlight java %} +ctx.startup(new BitmessageContext.Listener() { + @Override + public void receive(Plaintext plaintext) { + // TODO: Notify the user + } +}); +{% endhighlight %} + +Then you might want to create an identity + +{% highlight java %} +BitmessageAddress identity = ctx.createIdentity(false, Pubkey.Feature.DOES_ACK); +{% endhighlight %} + +or add some contacts + +{% highlight java %} +BitmessageAddress contact = new BitmessageAddress("BM-2cTarrmjMdRicKZ4qQ8A13JhoR3Uq6Zh5j"); +address.setAlias("Chris"); +ctx.addContact(contact); +{% endhighlight %} + +to which you can send some messages + +{% highlight java %} +ctx.send(identity, contact, "Test", "Hello Chris, this is a message."); +{% endhighlight %} diff --git a/_includes/footer.html b/_includes/footer.html new file mode 100644 index 0000000..72239f1 --- /dev/null +++ b/_includes/footer.html @@ -0,0 +1,38 @@ + diff --git a/_includes/head.html b/_includes/head.html new file mode 100644 index 0000000..1598d6f --- /dev/null +++ b/_includes/head.html @@ -0,0 +1,12 @@ + + + + + + {% if page.title %}{{ page.title | escape }}{% else %}{{ site.title | escape }}{% endif %} + + + + + + diff --git a/_includes/header.html b/_includes/header.html new file mode 100644 index 0000000..b3f86db --- /dev/null +++ b/_includes/header.html @@ -0,0 +1,27 @@ + diff --git a/_includes/icon-github.html b/_includes/icon-github.html new file mode 100644 index 0000000..e501a16 --- /dev/null +++ b/_includes/icon-github.html @@ -0,0 +1 @@ +{% include icon-github.svg %}{{ include.username }} diff --git a/_includes/icon-github.svg b/_includes/icon-github.svg new file mode 100644 index 0000000..4422c4f --- /dev/null +++ b/_includes/icon-github.svg @@ -0,0 +1 @@ + diff --git a/_includes/icon-twitter.html b/_includes/icon-twitter.html new file mode 100644 index 0000000..e623dbd --- /dev/null +++ b/_includes/icon-twitter.html @@ -0,0 +1 @@ +{{ include.username }} diff --git a/_includes/icon-twitter.svg b/_includes/icon-twitter.svg new file mode 100644 index 0000000..dcf660e --- /dev/null +++ b/_includes/icon-twitter.svg @@ -0,0 +1 @@ + diff --git a/_layouts/default.html b/_layouts/default.html new file mode 100644 index 0000000..e4ab96f --- /dev/null +++ b/_layouts/default.html @@ -0,0 +1,20 @@ + + + + {% include head.html %} + + + + {% include header.html %} + +
+
+ {{ content }} +
+
+ + {% include footer.html %} + + + + diff --git a/_layouts/page.html b/_layouts/page.html new file mode 100644 index 0000000..ce233ad --- /dev/null +++ b/_layouts/page.html @@ -0,0 +1,14 @@ +--- +layout: default +--- +
+ +
+

{{ page.title }}

+
+ +
+ {{ content }} +
+ +
diff --git a/_layouts/post.html b/_layouts/post.html new file mode 100644 index 0000000..3a0fb52 --- /dev/null +++ b/_layouts/post.html @@ -0,0 +1,15 @@ +--- +layout: default +--- +
+ +
+

{{ page.title }}

+ +
+ +
+ {{ content }} +
+ +
diff --git a/_sass/_base.scss b/_sass/_base.scss new file mode 100644 index 0000000..e3b30f3 --- /dev/null +++ b/_sass/_base.scss @@ -0,0 +1,212 @@ +/** + * Reset some basic elements + */ +body, h1, h2, h3, h4, h5, h6, +p, blockquote, pre, hr, +dl, dd, ol, ul, figure { + margin: 0; + padding: 0; +} + + + +/** + * Basic styling + */ +body { + font: $base-font-weight #{$base-font-size}/#{$base-line-height} $base-font-family; + color: $text-color; + background-color: $background-color; + -webkit-text-size-adjust: 100%; + -webkit-font-feature-settings: "kern" 1; + -moz-font-feature-settings: "kern" 1; + -o-font-feature-settings: "kern" 1; + font-feature-settings: "kern" 1; + font-kerning: normal; +} + + + +/** + * Set `margin-bottom` to maintain vertical rhythm + */ +h1, h2, h3, h4, h5, h6, +p, blockquote, pre, +ul, ol, dl, figure, +%vertical-rhythm { + margin-bottom: $spacing-unit / 2; +} + + + +/** + * Images + */ +img { + max-width: 100%; + vertical-align: middle; +} + + + +/** + * Figures + */ +figure > img { + display: block; +} + +figcaption { + font-size: $small-font-size; +} + + + +/** + * Lists + */ +ul, ol { + margin-left: $spacing-unit; +} + +li { + > ul, + > ol { + margin-bottom: 0; + } +} + + + +/** + * Headings + */ +h1, h2, h3, h4, h5, h6 { + font-weight: $base-font-weight; +} + + + +/** + * Links + */ +a { + color: $brand-color; + text-decoration: none; + + &:visited { + color: darken($brand-color, 15%); + } + + &:hover { + color: $text-color; + text-decoration: underline; + } +} + + + +/** + * Blockquotes + */ +blockquote { + color: $grey-color; + border-left: 4px solid $grey-color-light; + padding-left: $spacing-unit / 2; + font-size: 18px; + letter-spacing: -1px; + font-style: italic; + + > :last-child { + margin-bottom: 0; + } +} + +.info { + color: $text-color; + background-color: $blue-color-light; + border-left: 4px solid $blue-color; +} + + + +/** + * Code formatting + */ +pre, +code { + font-size: 15px; + border: 1px solid $grey-color-light; + border-radius: 3px; + background-color: #eef; +} + +code { + padding: 1px 5px; +} + +pre { + padding: 8px 12px; + overflow-x: auto; + + > code { + border: 0; + padding-right: 0; + padding-left: 0; + } +} + + + +/** + * Wrapper + */ +.wrapper { + max-width: -webkit-calc(#{$content-width} - (#{$spacing-unit} * 2)); + max-width: calc(#{$content-width} - (#{$spacing-unit} * 2)); + margin-right: auto; + margin-left: auto; + padding-right: $spacing-unit; + padding-left: $spacing-unit; + @extend %clearfix; + + @include media-query($on-laptop) { + max-width: -webkit-calc(#{$content-width} - (#{$spacing-unit})); + max-width: calc(#{$content-width} - (#{$spacing-unit})); + padding-right: $spacing-unit / 2; + padding-left: $spacing-unit / 2; + } +} + + + +/** + * Clearfix + */ +%clearfix { + + &:after { + content: ""; + display: table; + clear: both; + } +} + + + +/** + * Icons + */ +.icon { + + > svg { + display: inline-block; + width: 16px; + height: 16px; + vertical-align: middle; + + path { + fill: $grey-color; + } + } +} diff --git a/_sass/_layout.scss b/_sass/_layout.scss new file mode 100644 index 0000000..9cbfdde --- /dev/null +++ b/_sass/_layout.scss @@ -0,0 +1,242 @@ +/** + * Site header + */ +.site-header { + border-top: 5px solid $grey-color-dark; + border-bottom: 1px solid $grey-color-light; + min-height: 56px; + + // Positioning context for the mobile navigation icon + position: relative; +} + +.site-title { + font-size: 26px; + font-weight: 300; + line-height: 56px; + letter-spacing: -1px; + margin-bottom: 0; + float: left; + + &, + &:visited { + color: $grey-color-dark; + } +} + +.site-nav { + float: right; + line-height: 56px; + + .menu-icon { + display: none; + } + + .page-link { + color: $text-color; + line-height: $base-line-height; + + // Gaps between nav items, but not on the last one + &:not(:last-child) { + margin-right: 20px; + } + } + + @include media-query($on-palm) { + position: absolute; + top: 9px; + right: $spacing-unit / 2; + background-color: $background-color; + border: 1px solid $grey-color-light; + border-radius: 5px; + text-align: right; + + .menu-icon { + display: block; + float: right; + width: 36px; + height: 26px; + line-height: 0; + padding-top: 10px; + text-align: center; + + > svg { + width: 18px; + height: 15px; + + path { + fill: $grey-color-dark; + } + } + } + + .trigger { + clear: both; + display: none; + } + + &:hover .trigger { + display: block; + padding-bottom: 5px; + } + + .page-link { + display: block; + padding: 5px 10px; + + &:not(:last-child) { + margin-right: 0; + } + margin-left: 20px; + } + } +} + + + +/** + * Site footer + */ +.site-footer { + border-top: 1px solid $grey-color-light; + padding: $spacing-unit 0; +} + +.footer-heading { + font-size: 18px; + margin-bottom: $spacing-unit / 2; +} + +.contact-list, +.social-media-list { + list-style: none; + margin-left: 0; +} + +.footer-col-wrapper { + font-size: 15px; + color: $grey-color; + margin-left: -$spacing-unit / 2; + @extend %clearfix; +} + +.footer-col { + float: left; + margin-bottom: $spacing-unit / 2; + padding-left: $spacing-unit / 2; +} + +.footer-col-1 { + width: -webkit-calc(35% - (#{$spacing-unit} / 2)); + width: calc(35% - (#{$spacing-unit} / 2)); +} + +.footer-col-2 { + width: -webkit-calc(20% - (#{$spacing-unit} / 2)); + width: calc(20% - (#{$spacing-unit} / 2)); +} + +.footer-col-3 { + width: -webkit-calc(45% - (#{$spacing-unit} / 2)); + width: calc(45% - (#{$spacing-unit} / 2)); +} + +@include media-query($on-laptop) { + .footer-col-1, + .footer-col-2 { + width: -webkit-calc(50% - (#{$spacing-unit} / 2)); + width: calc(50% - (#{$spacing-unit} / 2)); + } + + .footer-col-3 { + width: -webkit-calc(100% - (#{$spacing-unit} / 2)); + width: calc(100% - (#{$spacing-unit} / 2)); + } +} + +@include media-query($on-palm) { + .footer-col { + float: none; + width: -webkit-calc(100% - (#{$spacing-unit} / 2)); + width: calc(100% - (#{$spacing-unit} / 2)); + } +} + + + +/** + * Page content + */ +.page-content { + padding: $spacing-unit 0; +} + +.page-heading { + font-size: 20px; +} + +.post-list { + margin-left: 0; + list-style: none; + + > li { + margin-bottom: $spacing-unit; + } +} + +.post-meta { + font-size: $small-font-size; + color: $grey-color; +} + +.post-link { + display: block; + font-size: 24px; +} + + + +/** + * Posts + */ +.post-header { + margin-bottom: $spacing-unit; +} + +.post-title { + font-size: 42px; + letter-spacing: -1px; + line-height: 1; + + @include media-query($on-laptop) { + font-size: 36px; + } +} + +.post-content { + margin-bottom: $spacing-unit; + + h2 { + font-size: 32px; + + @include media-query($on-laptop) { + font-size: 28px; + } + } + + h3 { + font-size: 26px; + + @include media-query($on-laptop) { + font-size: 22px; + } + } + + h4 { + font-size: 20px; + + @include media-query($on-laptop) { + font-size: 18px; + } + } +} diff --git a/_sass/_syntax-highlighting.scss b/_sass/_syntax-highlighting.scss new file mode 100644 index 0000000..8fac597 --- /dev/null +++ b/_sass/_syntax-highlighting.scss @@ -0,0 +1,71 @@ +/** + * Syntax highlighting styles + */ +.highlight { + background: #fff; + @extend %vertical-rhythm; + + .highlighter-rouge & { + background: #eef; + } + + .c { color: #998; font-style: italic } // Comment + .err { color: #a61717; background-color: #e3d2d2 } // Error + .k { font-weight: bold } // Keyword + .o { font-weight: bold } // Operator + .cm { color: #998; font-style: italic } // Comment.Multiline + .cp { color: #999; font-weight: bold } // Comment.Preproc + .c1 { color: #998; font-style: italic } // Comment.Single + .cs { color: #999; font-weight: bold; font-style: italic } // Comment.Special + .gd { color: #000; background-color: #fdd } // Generic.Deleted + .gd .x { color: #000; background-color: #faa } // Generic.Deleted.Specific + .ge { font-style: italic } // Generic.Emph + .gr { color: #a00 } // Generic.Error + .gh { color: #999 } // Generic.Heading + .gi { color: #000; background-color: #dfd } // Generic.Inserted + .gi .x { color: #000; background-color: #afa } // Generic.Inserted.Specific + .go { color: #888 } // Generic.Output + .gp { color: #555 } // Generic.Prompt + .gs { font-weight: bold } // Generic.Strong + .gu { color: #aaa } // Generic.Subheading + .gt { color: #a00 } // Generic.Traceback + .kc { font-weight: bold } // Keyword.Constant + .kd { font-weight: bold } // Keyword.Declaration + .kp { font-weight: bold } // Keyword.Pseudo + .kr { font-weight: bold } // Keyword.Reserved + .kt { color: #458; font-weight: bold } // Keyword.Type + .m { color: #099 } // Literal.Number + .s { color: #d14 } // Literal.String + .na { color: #008080 } // Name.Attribute + .nb { color: #0086B3 } // Name.Builtin + .nc { color: #458; font-weight: bold } // Name.Class + .no { color: #008080 } // Name.Constant + .ni { color: #800080 } // Name.Entity + .ne { color: #900; font-weight: bold } // Name.Exception + .nf { color: #900; font-weight: bold } // Name.Function + .nn { color: #555 } // Name.Namespace + .nt { color: #000080 } // Name.Tag + .nv { color: #008080 } // Name.Variable + .ow { font-weight: bold } // Operator.Word + .w { color: #bbb } // Text.Whitespace + .mf { color: #099 } // Literal.Number.Float + .mh { color: #099 } // Literal.Number.Hex + .mi { color: #099 } // Literal.Number.Integer + .mo { color: #099 } // Literal.Number.Oct + .sb { color: #d14 } // Literal.String.Backtick + .sc { color: #d14 } // Literal.String.Char + .sd { color: #d14 } // Literal.String.Doc + .s2 { color: #d14 } // Literal.String.Double + .se { color: #d14 } // Literal.String.Escape + .sh { color: #d14 } // Literal.String.Heredoc + .si { color: #d14 } // Literal.String.Interpol + .sx { color: #d14 } // Literal.String.Other + .sr { color: #009926 } // Literal.String.Regex + .s1 { color: #d14 } // Literal.String.Single + .ss { color: #990073 } // Literal.String.Symbol + .bp { color: #999 } // Name.Builtin.Pseudo + .vc { color: #008080 } // Name.Variable.Class + .vg { color: #008080 } // Name.Variable.Global + .vi { color: #008080 } // Name.Variable.Instance + .il { color: #099 } // Literal.Number.Integer.Long +} diff --git a/about.md b/about.md new file mode 100644 index 0000000..89713dd --- /dev/null +++ b/about.md @@ -0,0 +1,12 @@ +--- +layout: page +title: About +permalink: /about/ +--- + +Jabit is a Bitmessage library for Java. It aims to be easy to use, so you can create great Bitmessage apps. + +You can find the source code for the Jabit at: +{% include icon-github.html username="Dissem" %} / +[jekyll-new](https://github.com/Dissem/Jabit) + diff --git a/css/main.scss b/css/main.scss new file mode 100644 index 0000000..241b4b2 --- /dev/null +++ b/css/main.scss @@ -0,0 +1,57 @@ +--- +# Only the main Sass file needs front matter (the dashes are enough) +--- +@charset "utf-8"; + + + +// Our variables +$base-font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; +$base-font-size: 16px; +$base-font-weight: 400; +$small-font-size: $base-font-size * 0.875; +$base-line-height: 1.5; + +$spacing-unit: 30px; + +$text-color: #111; +$background-color: #fdfdfd; +$brand-color: #2a7ae2; + +$grey-color: #828282; +$grey-color-light: lighten($grey-color, 40%); +$grey-color-dark: darken($grey-color, 25%); + +$blue-color: #2A3BBC; +$blue-color-light: lighten($blue-color, 40%); +$blue-color-dark: darken($blue-color, 25%); + +// Width of the content area +$content-width: 800px; + +$on-palm: 600px; +$on-laptop: 800px; + + + +// Use media queries like this: +// @include media-query($on-palm) { +// .wrapper { +// padding-right: $spacing-unit / 2; +// padding-left: $spacing-unit / 2; +// } +// } +@mixin media-query($device) { + @media screen and (max-width: $device) { + @content; + } +} + + + +// Import partials from `sass_dir` (defaults to `_sass`) +@import + "base", + "layout", + "syntax-highlighting" +; diff --git a/dependencies.markdown b/dependencies.markdown new file mode 100644 index 0000000..5c40e3a --- /dev/null +++ b/dependencies.markdown @@ -0,0 +1,51 @@ +--- +layout: page +title: "Dependencies" +permalink: "/dependencies" +categories: dependencies +--- + +`jabit-core` contains the Bitmessage context and all entities that will be used by the other modules. +Whatever you do, you'll need this. + +`jabit-networking` manages connections to the Bitmessage network. This is probably the most complicated +part of the Jabit project. TODO + +`jabit-repositories` is where the entities from core are stored. The default implementation uses JDBC +to access a H2 database. It should mostly be easy to use other SQL databases (I'll happily accept pull +requests) but if you want to use some NoSQL database or a very restricted one (as with SQLite) you might +want to create your own implementation. + +`jabit-cryptography-bouncy` impmlements everything related to encryption, cryptographic hashes and +secure random numbers. As the name suggests, it uses the [Bouncycastle](https://www.bouncycastle.org/) +library. + +`jabit-cryptography-spongy` is basically a copy of the spongy one, but using +[Spongycastle](https://rtyley.github.io/spongycastle/) instead. + + + + +TODO + +Add Jabit as Gradle dependency: + +{% highlight groovy %} +compile 'ch.dissem.jabit:jabit-core:1.0.0' +{% endhighlight %} + +Unless you want to implement your own, also add the following: + +{% highlight groovy %} +compile 'ch.dissem.jabit:jabit-networking:1.0.0' +compile 'ch.dissem.jabit:jabit-repositories:1.0.0' +compile 'ch.dissem.jabit:jabit-cryptography-bouncy:1.0.0' +{% endhighlight %} + +And if you want to import from or export to the Wallet Import Format (used by PyBitmessage) you might also want to add: + +{% highlight groovy %} +compile 'ch.dissem.jabit:jabit-wif:1.0.0' +{% endhighlight %} + +For Android clients use `jabit-cryptography-spongy` instead of `jabit-cryptography-bouncy`. diff --git a/feed.xml b/feed.xml new file mode 100644 index 0000000..a6628bd --- /dev/null +++ b/feed.xml @@ -0,0 +1,30 @@ +--- +layout: null +--- + + + + {{ site.title | xml_escape }} + {{ site.description | xml_escape }} + {{ site.url }}{{ site.baseurl }}/ + + {{ site.time | date_to_rfc822 }} + {{ site.time | date_to_rfc822 }} + Jekyll v{{ jekyll.version }} + {% for post in site.posts limit:10 %} + + {{ post.title | xml_escape }} + {{ post.content | xml_escape }} + {{ post.date | date_to_rfc822 }} + {{ post.url | prepend: site.baseurl | prepend: site.url }} + {{ post.url | prepend: site.baseurl | prepend: site.url }} + {% for tag in post.tags %} + {{ tag | xml_escape }} + {% endfor %} + {% for cat in post.categories %} + {{ cat | xml_escape }} + {% endfor %} + + {% endfor %} + + diff --git a/index.markdown b/index.markdown new file mode 100644 index 0000000..2cd8fe6 --- /dev/null +++ b/index.markdown @@ -0,0 +1,18 @@ +--- +layout: page +title: "Jabit" +--- + +Jabit is a Java implementation for the Bitmessage protocol. If you visit this page, I assume you are a Java developer and already know about [Bitmessage][bitmessage]. + +Please note that it still has its limitations, but the API should now be stable. Jabit uses Semantic Versioning, meaning as long as the major version doesn't change, nothing should break if you update. + +[bitmessage]: https://bitmessage.org/wiki/Main_Page + +* [Quick Start](/quickstart): take this guide, add some great ideas, and you've got your Bitmessage app. +* [Dependencies](/dependencies): want to know what all those dependencies are about? Read on. +* [API](/api): want to create something more complicated? An [app for Android][abit] perhaps? You probably need this in-depth documentation. [Or plough through the source right away...][jabit] + +[jabit]: https://github.com/Dissem/Jabit +[abit]: https://github.com/Dissem/Abit + diff --git a/quickstart.markdown b/quickstart.markdown new file mode 100644 index 0000000..ec2c6cd --- /dev/null +++ b/quickstart.markdown @@ -0,0 +1,84 @@ +--- +layout: page +title: "Quick Start" +permalink: "/quickstart" +categories: quick start +--- + +### Project Setup + +> As Jabit uses Gradle, it is also used for this documentation. If you're used to Maven +> it should be simple enough to deduce what you'll need to put into your `pom.xml`. +{: .info} + +Add Jabit as Gradle dependency: + +{% highlight groovy %} +compile 'ch.dissem.jabit:jabit-core:1.0.0' +{% endhighlight %} + +Unless you want to implement your own, also add the following: + +{% highlight groovy %} +compile 'ch.dissem.jabit:jabit-networking:1.0.0' +compile 'ch.dissem.jabit:jabit-repositories:1.0.0' +compile 'ch.dissem.jabit:jabit-cryptography-bouncy:1.0.0' +{% endhighlight %} + +And if you want to import from or export to the Wallet Import Format (used by PyBitmessage) you might also want to add: + +{% highlight groovy %} +compile 'ch.dissem.jabit:jabit-wif:1.0.0' +{% endhighlight %} + +For Android clients use `jabit-cryptography-spongy` instead of `jabit-cryptography-bouncy`. + + +### Usage + +First, you'll need to create a `BitmessageContext`: + +{% highlight java %} +JdbcConfig jdbcConfig = new JdbcConfig(); +BitmessageContext ctx = new BitmessageContext.Builder() + .addressRepo(new JdbcAddressRepository(jdbcConfig)) + .inventory(new JdbcInventory(jdbcConfig)) + .messageRepo(new JdbcMessageRepository(jdbcConfig)) + .nodeRegistry(new MemoryNodeRegistry()) + .networkHandler(new NetworkNode()) + .cryptography(new BouncyCryptography()) + .build(); +{% endhighlight %} + +This creates a simple context using a H2 database that will be created in the user's home directory. Next you'll need to +start the context and decide what happens if a message arrives: + +{% highlight java %} +ctx.startup(new BitmessageContext.Listener() { + @Override + public void receive(Plaintext plaintext) { + // TODO: Notify the user + } +}); +{% endhighlight %} + +Then you might want to create an identity + +{% highlight java %} +BitmessageAddress identity = ctx.createIdentity(false, Pubkey.Feature.DOES_ACK); +{% endhighlight %} + +or add some contacts + +{% highlight java %} +BitmessageAddress contact = new BitmessageAddress("BM-2cTarrmjMdRicKZ4qQ8A13JhoR3Uq6Zh5j"); +address.setAlias("Chris"); +ctx.addContact(contact); +{% endhighlight %} + +to which you can send some messages + +{% highlight java %} +ctx.send(identity, contact, "Test", "Hello Chris, this is a message."); +{% endhighlight %} +