# Gora QR Review 1. `/lib/qr.hoon` - truly a masterful construction - style points: * `ub-to-td` and `td-to-ub` could be one-liners, though they are well styled in tall form. * in data-trajectory, rather than escaping bucs, you can give buc a name: `=* dis-buc $` if you'd like, perhaps aiding in legibility. * `lvl` could probably be just ?(%7 %15 %25 %30) or ?(%l %m %q %h) if necessary, and I would probably have moved it into the library rather than separating it to it's own sur file (*PENDING FURTHER INVESTIGATION TO DETERMINE IF THIS IS RIGHT*). 2. `/app/gora/plead.hoon` - really impressed you were able to get through this sail portion so effectively - css styling, even though minimal, is cute (like the buttons) 3. `/sur/gora.hoon` - we probably need to version `manage-gora-2` if we really want to release this, as some people would not have that poke, causing crashing (this is probably also fine as it's not passed in a subscription) 3. Method of Execution - Generate a QR code that will be stored in state: ```hoon %create-gora-qr =^ cards state (manage act) =- [- cards +.state] %- crip "Success" ``` and (and this next section is tight, like it!) > Note: I probably would have gone with qr-gora to meet the width scheme, although I grant that it's not perfect as is ```hoon %create-gora-qr =/ key id.gal =/ pw (sham eny.bol) =/ qr-data =/ res "{<key>}|{<our.bol>}|{<pw>}" (main:qr:qr res %l) =/ val [pw now.bol hours-valid.gal qr-data] [~ state(gora-qrs (~(add ja gora-qrs) key val))] ``` - Attempt to claim a Gora by QR code: ```hoon %claim-gora-qr =^ cards state (manage act) =- [- cards +.state] %- crip """ ❗アラート: Asynchronous Operation❗ ❗あなたは待たなければなりません❗ ❗Do the needful: wait❗ """ ``` and ```hoon %claim-gora-qr =/ code-tape (trip code.man) =/ sep-idxs (fand ~['|'] code-tape) ?> =((lent sep-idxs) 2) =/ gor-id=@uv =/ gor-id-tape (swag [0 (snag 0 sep-idxs)] code-tape) `@uv`(scan (slag 2 gor-id-tape) viz:ag) =/ host=ship =/ length (sub (sub (snag 1 sep-idxs) (snag 0 sep-idxs)) 1) =/ host-tape (swag [(add (snag 0 sep-idxs) 1) length] code-tape) `ship`(scan (slag 1 host-tape) fed:ag) =/ pw=@uvH =/ pw-tape (slag (add (snag 1 sep-idxs) 1) code-tape) `@uvH`(scan (slag 2 pw-tape) viz:ag) =/ wir=path /claim/(scot %uv gor-id)/(scot %p host) :- :~ =- [%pass wir %agent [host %gora] %poke -] =- [%gora-transact-2 !>(`transact-2`-)] [%claim gor-id pw our.bol] == state ``` - Process requests to claim a Gora by QR code: > Note: nicely commented, but please only lower case ```hoon %claim :: Does the gora even exist in our pita? ?. (~(has by pita) id.tan) ~& ["No gora found for id" id.tan] [~ state] :: What are the qrs for a pita? =/ lora-qr=(list gora-qr) (~(get ja gora-qrs) id.tan) :: Fail if there are no qrs for that pita ?: =((lent lora-qr) 0) ~& ["No qrs found for id" id.tan] [~ state] :: Extract all qrs that aren't expired yet =/ remaining-qrs=(list gora-qr) %+ skip lora-qr |= a=gora-qr ?: =(duration-hrs.a 0) %.n :: Never elapse if duration 0 =/ dur=@dr (mul duration-hrs.a ~h1) =/ elapsed=@dr (sub now.bowl made.a) (lte dur elapsed) =/ separated %+ skid remaining-qrs |= a=gora-qr =(pw.tan pw.a) :: If we don't have exactly 1 match, we fail ?. =((lent p.separated) 1) ~& ["There were exactly" (lent p.separated) "but we need 1"] [~ state] =. remaining-qrs q.separated =^ new-cards state %- manage:hc [%send-gora id.tan `(set ship)`(silt [from.tan ~])] :- new-cards %= state gora-qrs (~(put by gora-qrs) id.tan remaining-qrs) == ``` 4. User Experience: - I create a Gora QR - I specify infinite availability or a limited duration in hours - I click Generate QR - I get a success modal indicating that a QR was generated, it now appears on the screen - I now see how many hours are left in the viability of that QR code and can generate additional codes, should I choose to. - I can scan that QR code using the Request Gora (plead) menu from another instance of Gora - My request is processed by the host