View Source StickerClient (stickerclient v0.1.0)

StickerClient is a library for interfacing with the Signal Stickers API.

downloading

Downloading

Download operations work primarily on two elements, Packs and Stickers. These are represented as StickerClient.Pack and StickerClient.Sticker respectively. A Pack struct contains information about the sticker pack. It is a translated view of Signals manifest protobuf definition. The Pack may or may not contain sticker definitions with content, depending on how the API is called.

Most likely, manifests will be downloaded alongside their sticker content in full. The Pack ID and Pack Key can be provided individually, or parsed from a valid URL.

iex(1)> StickerClient.Downloader.download_pack("https://signal.art/addstickers/#pack_id=45bdc863f62e6a2548052e0a0c4cb153&pack_key=9dc85e4d5d65d0b272274e5bd4f047fcda3551e77f89053c06078ace81fa6a41")
{:ok,
 %StickerClient.Pack{
   title: "oh my frog by ilaso",
   author: "https://t.me/addstickers/ohmyfrog_ilaso",
   cover: %StickerClient.Protos.Pack.Sticker{
     id: 0,
     emoji: nil,
     __unknown_fields__: []
   },
   stickers: [
     %StickerClient.Sticker{
       id: 0,
       emoji: "👍",
       data: <<82, 73, 70, 70, 242, 85, 0, 0, 87, 69, 66, 80, 86, 80, 56, 88,
         10, 0, 0, 0, 16, 0, 0, 0, 255, 1, 0, 255, 1, 0, 65, 76, 80, 72, 151,
         27, 0, 0, 1, 240, ...>>
     },
     %StickerClient.Sticker{
       id: 1,
       emoji: "🐸",
       data: <<82, 73, 70, 70, 170, 100, 0, 0, 87, 69, 66, 80, 86, 80, 56, 88,
         10, 0, 0, 0, 16, 0, 0, 0, 255, 1, 0, 255, 1, 0, 65, 76, 80, 72, 32, 31,
         0, 0, 1, ...>>
     },
     %StickerClient.Sticker{
       id: 2,
       emoji: "🐸",
       data: <<82, 73, 70, 70, 52, 60, 0, 0, 87, 69, 66, 80, 86, 80, 56, 88, 10,
         0, 0, 0, 16, 0, 0, 0, 255, 1, 0, 255, 1, 0, 65, 76, 80, 72, 77, 21, 0,
         0, ...>>
     },
     %StickerClient.Sticker{
       id: 3,
       emoji: "🐸",
       data: <<82, 73, 70, 70, 80, 82, 0, 0, 87, 69, 66, 80, 86, 80, 56, 88, 10,
         0, 0, 0, 16, 0, 0, 0, 255, 1, 0, 255, 1, 0, 65, 76, 80, 72, 79, 30, 0,
         ...>>
     },
     %StickerClient.Sticker{
       id: 4,
       emoji: "🐸",
       data: <<82, 73, 70, 70, 18, 76, 0, 0, 87, 69, 66, 80, 86, 80, 56, 88, 10,
         0, 0, 0, 16, 0, 0, 0, 255, 1, 0, 255, 1, 0, 65, 76, 80, 72, 117, 21,
         ...>>
     } 
     ... CONTINUED

It is possible, using the downloader, to only retrieve a manifest:

iex> StickerClient.Downloader.download_manifest("45bdc863f62e6a2548052e0a0c4cb153", "9dc85e4d5d65d0b272274e5bd4f047fcda3551e77f89053c06078ace81fa6a41")
{:ok,
 %StickerClient.Pack{
   title: "oh my frog by ilaso",
   author: "https://t.me/addstickers/ohmyfrog_ilaso",
   cover: %StickerClient.Protos.Pack.Sticker{
     id: 0,
     emoji: nil,
     __unknown_fields__: []
   },
   stickers: [
     %StickerClient.Sticker{id: 0, emoji: "👍", data: nil},
     %StickerClient.Sticker{id: 1, emoji: "🐸", data: nil},
     %StickerClient.Sticker{id: 2, emoji: "🐸", data: nil},
     %StickerClient.Sticker{id: 3, emoji: "🐸", data: nil},
     %StickerClient.Sticker{id: 4, emoji: "🐸", data: nil},
     %StickerClient.Sticker{id: 5, emoji: "🐸", data: nil},
     %StickerClient.Sticker{id: 6, emoji: "🐸", data: nil},
     %StickerClient.Sticker{id: 7, emoji: "🐸", data: nil},
     %StickerClient.Sticker{id: 8, emoji: "🐸", data: nil},
     %StickerClient.Sticker{id: 9, emoji: "🐸", data: nil},
     %StickerClient.Sticker{id: 10, emoji: "🐸", data: nil},
     %StickerClient.Sticker{id: 11, emoji: "🐸", data: nil},
     %StickerClient.Sticker{id: 12, emoji: "🐸", data: nil},
     %StickerClient.Sticker{id: 13, emoji: "🐸", data: nil},
     %StickerClient.Sticker{id: 14, emoji: "🐸", data: nil},
     %StickerClient.Sticker{id: 15, emoji: "🐸", data: nil},
     %StickerClient.Sticker{id: 16, emoji: "🐸", data: nil},
     %StickerClient.Sticker{id: 17, emoji: "🐸", data: nil},
     %StickerClient.Sticker{id: 18, emoji: "🐸", data: nil},
     %StickerClient.Sticker{id: 19, emoji: "🐸", data: nil},
     %StickerClient.Sticker{id: 20, emoji: "🐸", data: nil},
     %StickerClient.Sticker{id: 21, emoji: "🐸", data: nil},
     %StickerClient.Sticker{id: 22, emoji: "🐸", data: nil},
     %StickerClient.Sticker{id: 23, emoji: "🐸", data: nil},
     %StickerClient.Sticker{id: 24, emoji: "🐸", data: nil},
     %StickerClient.Sticker{id: 25, emoji: "🐸", data: nil},
     %StickerClient.Sticker{id: 26, emoji: "🐸", data: nil},
     %StickerClient.Sticker{id: 27, emoji: "🐸", data: nil},
     %StickerClient.Sticker{id: 28, emoji: "🐸", data: nil},
     %StickerClient.Sticker{id: 29, emoji: "🐸", data: nil},
     %StickerClient.Sticker{id: 30, emoji: "🐸", data: nil},
     %StickerClient.Sticker{id: 31, emoji: "🐸", data: nil},
     %StickerClient.Sticker{id: 32, emoji: "🐸", data: nil},
     %StickerClient.Sticker{id: 33, emoji: "🐸", data: nil},
     %StickerClient.Sticker{id: 34, emoji: "🐸", data: nil},
     %StickerClient.Sticker{id: 35, emoji: "🐸", data: nil},
     %StickerClient.Sticker{id: 36, emoji: "🐸", data: nil},
     %StickerClient.Sticker{id: 37, emoji: "🐸", data: nil},
     %StickerClient.Sticker{id: 38, emoji: "🐸", data: nil},
     %StickerClient.Sticker{id: 39, emoji: "🐸", data: nil}
   ]
 }}

In the above example, the sticker data is nil. We have retrieved only the representation of the stickers, not the sticker data.

Sticker data can be downloaded on a per-sticker-basis by providing either the ID or the StickerClient.Sticker struct to StickerClient.Downloader.download_sticker/3. If an ID is provided only, the emoji will not be populated, as this comes from the manifest:

iex> StickerClient.Downloader.download_sticker(10, "45bdc863f62e6a2548052e0a0c4cb153", "9dc85e4d5d65d0b272274e5bd4f047fcda3551e77f89053c06078ace81fa6a41")
{:ok,
 %StickerClient.Sticker{
   id: 10,
   emoji: nil,
   data: <<82, 73, 70, 70, 0, 87, 0, 0, 87, 69, 66, 80, 86, 80, 56, 88, 10, 0,
     0, 0, 16, 0, 0, 0, 255, 1, 0, 255, 1, 0, 65, 76, 80, 72, 24, 33, 0, 0, 1,
     240, 135, 109, 219, 43, 39, ...>>
 }}

Enumerables of integers IDs or StickerClient.Sticker's can also be provided:

iex> StickerClient.Downloader.download_stickers(1..3, "45bdc863f62e6a2548052e0a0c4cb153", "9dc85e4d5d65d0b272274e5bd4f047fcda3551e77f89053c06078ace81fa6a41")
[
  %StickerClient.Sticker{
    id: 1,
    emoji: nil,
    data: <<82, 73, 70, 70, 170, 100, 0, 0, 87, 69, 66, 80, 86, 80, 56, 88, 10,
      0, 0, 0, 16, 0, 0, 0, 255, 1, 0, 255, 1, 0, 65, 76, 80, 72, 32, 31, 0, 0,
      1, 240, 199, 255, 255, 35, 39, 217, ...>>
  },
  %StickerClient.Sticker{
    id: 2,
    emoji: nil,
    data: <<82, 73, 70, 70, 52, 60, 0, 0, 87, 69, 66, 80, 86, 80, 56, 88, 10, 0,
      0, 0, 16, 0, 0, 0, 255, 1, 0, 255, 1, 0, 65, 76, 80, 72, 77, 21, 0, 0, 1,
      240, 70, 109, 219, 114, 167, ...>>
  },
  %StickerClient.Sticker{
    id: 3,
    emoji: nil,
    data: <<82, 73, 70, 70, 80, 82, 0, 0, 87, 69, 66, 80, 86, 80, 56, 88, 10, 0,
      0, 0, 16, 0, 0, 0, 255, 1, 0, 255, 1, 0, 65, 76, 80, 72, 79, 30, 0, 0, 1,
      240, 135, 109, 219, 51, ...>>
  }
]

As previously mentioned, StickerClient.Sticker structs are also valid input, and thus manifest definitions can be used to retrieve some or all of the stickers they define. If retrieved in this manner, the emoji field will be populated alongside ID and the sticker data:

iex> {:ok, manifest} = StickerClient.Downloader.download_manifest("45bdc863f62e6a2548052e0a0c4cb153", "9dc85e4d5d65d0b272274e5bd4f047fcda3551e77f89053c06078ace81fa6a41")
iex> manifest.stickers |> Enum.take(3) |> StickerClient.Downloader.download_stickers("45bdc863f62e6a2548052e0a0c4cb153", "9dc85e4d5d65d0b272274e5bd4f047fcda3551e77f89053c06078ace81fa6a41")
[
  %StickerClient.Sticker{
    id: 0,
    emoji: "👍",
    data: <<82, 73, 70, 70, 242, 85, 0, 0, 87, 69, 66, 80, 86, 80, 56, 88, 10,
      0, 0, 0, 16, 0, 0, 0, 255, 1, 0, 255, 1, 0, 65, 76, 80, 72, 151, 27, 0, 0,
      1, 240, 135, 109, 187, 42, 167, 253, ...>>
  },
  %StickerClient.Sticker{
    id: 1,
    emoji: "🐸",
    data: <<82, 73, 70, 70, 170, 100, 0, 0, 87, 69, 66, 80, 86, 80, 56, 88, 10,
      0, 0, 0, 16, 0, 0, 0, 255, 1, 0, 255, 1, 0, 65, 76, 80, 72, 32, 31, 0, 0,
      1, 240, 199, 255, 255, 35, 39, ...>>
  },
  %StickerClient.Sticker{
    id: 2,
    emoji: "🐸",
    data: <<82, 73, 70, 70, 52, 60, 0, 0, 87, 69, 66, 80, 86, 80, 56, 88, 10, 0,
      0, 0, 16, 0, 0, 0, 255, 1, 0, 255, 1, 0, 65, 76, 80, 72, 77, 21, 0, 0, 1,
      240, 70, 109, 219, 114, ...>>
  }
]