NOTE: Get an APIKey.
Here we load our required modules, and ask the user to give us some input from the command line.
#!/usr/bin/env perl use strict; use Wing::Client; use Getopt::Long; use feature 'say'; my $url = "https://tabletop.events"; my $conid; my $username; my $password; my $api_key; GetOptions( "conid=s" => \$conid, "username=s" => \$username, "passwword=s" => \$password, "api_key=s" => \$api_key, ); unless ($conid && $username && $password && $api_key) { say "Usage: $0 --conid=xxx --username=MYUSER --password=MYPASS --api_key=xxx"; exit; } my $wing = Wing::Client->new(uri => $url);
Here we establish a user session. We could store this session to use over and over so that we don't have to enter our username and password and api_key on every execution of the program.
my $session = $wing->post('session', { username => $username, password => $password, api_key_id => $api_key });
Fetch badges for our registered users.
my $data = { paging => { total_pages => 10000, next_page_number => 1 }}; # giving ourselves some # initial data so the loop # doesn't die before we've # fetched anything my @badges; while ($data->{paging}{total_pages} >= $data->{paging}{next_page_number}) { $data = $wing->get('/api/convention/'.$conid.'/badges', { # build the url to the # badges API, note that # Wing::Client does # https://tabletop.events # for us verified => 1, # we only want badges that # have actually completed # the checkout process print_count => 0, # only return them if they # haven't already been # printed session_id => $session->{id}, # have to give it our # session_id since we're # asking for privileged # data _page_number => $data->{paging}{next_page_number}, # we'll use the paging data # returned by the api to # loop until we have all # the badge data _items_per_page => 100, # get 100 badges per # request _include_related_objects => ['conventionreceipt'], # let's include the # convention receipt object # in our result set _include_relationships => 1, # let's get the # relationship urls so that # we know how to fetch the # tickets for each badge _order_by => 'badge_number', # override whatever the # default ordering for # badges would be }); foreach my $badge (@{$data->{items}}) { push @badges, $badge; } }
Given that we fetched a list of badges we might want to download the tickets associated with those badges as well.
my $badge = pop @badges; my $data = { paging => { total_pages => 10000, next_page_number => 1 }}; my @tickets; while ($data->{paging}{total_pages} >= $data->{paging}{next_page_number}) { $data = $wing->get($badge->{_relationships}{tickets}, { # let's use the URL the badge # provides for us for # fetching tickets verified => 1, # only get tickets that # completed the checkout # process print_count => 0, # only return them if they # haven't already been # printed session_id => $session->{id}, # gotta give our creds to # fetch privileged data _page_number => $data->{paging}{next_page_number}, # use the service's paging # data to iterate through all # the tickets _items_per_page => 100, # fetch 100 tickets per # request _include_related_objects => ['conventionreceipt','event'], # include the receipt object # and the event object in our # result set _order_by => 'ticket_number', # override the default # ordering for tickets }); foreach my $ticket (@{$data->{items}}) { push @tickets, $ticket; } }
If you're using an external printing service to print your badges and tickets, then you may want to be able to mark them printed with your own program.
$wing->post('convention/'.$conid.'/print', { session_id => $session->{id}, badges => ['xxx','xxx','xxx','xxx','xxx'], # the list of badge ids to mark printed tickets => ['xxx','xxx','xxx','xxx','xxx'], # the list of ticket ids to mark printed });