Skip to content

Commit

Permalink
Implementing mail bodies.
Browse files Browse the repository at this point in the history
  • Loading branch information
jtmueller committed Apr 6, 2012
1 parent 332a849 commit c92573e
Show file tree
Hide file tree
Showing 5 changed files with 82 additions and 21 deletions.
35 changes: 35 additions & 0 deletions EveLib.RavenCache/CharacterCache.fs
Expand Up @@ -66,6 +66,7 @@ type internal CharacterCache(baseClient: FSharp.ICharQueries, store: IDocumentSt
headers
|> Seq.filter (fun h -> h.CachedUntil < DateTimeOffset.UtcNow)
|> Seq.append updated
|> Seq.distinctBy (fun h -> h.Id, h.RecipientId)
return query {
for h in merged do
sortByDescending h.SentDate
Expand All @@ -74,12 +75,46 @@ type internal CharacterCache(baseClient: FSharp.ICharQueries, store: IDocumentSt
return upcast headers
}

let getMailBodies charId messageIds = async {
use session = store.OpenAsyncSession()

let! bodies =
query {
for b in session.Query<MailBody>() do
where (b.RecipientId = charId &&
LinqExtensions.In(b.Id, messageIds))
} |> AsyncQuery.asIList

if bodies.Count = 0 || bodies.Count < Seq.length messageIds then
let! updated = baseClient.GetMailBodies(charId, messageIds)
bodies |> Seq.iter session.Advanced.Evict
updated |> Seq.iter session.Store
do! session.AsyncSaveChanges()
if bodies.Count = 0 then
return updated
else
return
bodies
|> Seq.filter (fun b -> b.CachedUntil < DateTimeOffset.UtcNow)
|> Seq.append updated
|> Seq.distinctBy (fun b -> b.Id, b.RecipientId)
|> Seq.cache
else
return upcast bodies
}

interface EveLib.FSharp.ICharQueries with
member x.GetAccountBalance(charId) = getAccountBalance charId
member x.GetMailHeaders(charId) = getMailHeaders charId
member x.GetMailBodies(charId, [<ParamArray>] messageIds) =
getMailBodies charId messageIds
interface EveLib.Async.ICharQueries with
member x.GetAccountBalance(charId) = getAccountBalance charId |> Async.StartAsTask
member x.GetMailHeaders(charId) = getMailHeaders charId |> Async.StartAsTask
member x.GetMailBodies(charId, [<ParamArray>] messageIds) =
getMailBodies charId messageIds |> Async.StartAsTask
interface EveLib.Sync.ICharQueries with
member x.GetAccountBalance(charId) = getAccountBalance charId |> Async.RunSynchronously
member x.GetMailHeaders(charId) = getMailHeaders charId |> Async.RunSynchronously
member x.GetMailBodies(charId, [<ParamArray>] messageIds) =
getMailBodies charId messageIds |> Async.RunSynchronously
11 changes: 11 additions & 0 deletions EveLib.Tests/CharTests.fs
Expand Up @@ -28,5 +28,16 @@ type BaseCharTests(clientFactory: unit -> FSharp.IEveClient) =
Assert.NotEmpty(mailHeaders)
} |> Async.StartAsTask

[<Fact>]
let ``Can get mail bodies`` () =
async {
let client = clientFactory()
let! charInfo = client.GetCharacters()
let subject = charInfo.Characters |> Seq.head
let! mailHeaders = client.Character.GetMailHeaders(subject.Id)
let! mailBodies = client.Character.GetMailBodies(subject.Id, mailHeaders |> Seq.map (fun h -> h.Id) |> Array.ofSeq)
Assert.NotEmpty(mailBodies)
} |> Async.StartAsTask

type RavenCharTests() =
inherit BaseCharTests(fun () -> upcast EveLib.RavenCache.RavenEveClient(apiKey))
17 changes: 17 additions & 0 deletions EveLib/CharacterQueries.fs
Expand Up @@ -51,12 +51,29 @@ type internal CharacterQueries(apiValues: (string * string) list) =
|> Seq.cache
}

let getMailBodies charId (messageIds:int seq) = async {
let values = ("characterID", string charId) :: ("ids", String.Join(",", messageIds)) :: apiValues
let! response = getResponse "/char/MailBodies.xml.aspx" values
let rowset = RowSet(response.Result.Element(xn "rowset"))
return
rowset.Rows
|> Seq.map (fun r -> { Id = xval r?messageID
RecipientId = charId
Text = r.Element.Value
QueryTime = response.QueryTime
CachedUntil = response.CachedUntil })
|> Seq.cache
}

interface EveLib.FSharp.ICharQueries with
member x.GetAccountBalance(charId) = getAccountBalance charId
member x.GetMailHeaders(charId) = getMailHeaders charId
member x.GetMailBodies(charId, msgIds) = getMailBodies charId msgIds
interface EveLib.Async.ICharQueries with
member x.GetAccountBalance(charId) = getAccountBalance charId |> Async.StartAsTask
member x.GetMailHeaders(charId) = getMailHeaders charId |> Async.StartAsTask
member x.GetMailBodies(charId, msgIds) = getMailBodies charId msgIds |> Async.StartAsTask
interface EveLib.Sync.ICharQueries with
member x.GetAccountBalance(charId) = getAccountBalance charId |> Async.RunSynchronously
member x.GetMailHeaders(charId) = getMailHeaders charId |> Async.RunSynchronously
member x.GetMailBodies(charId, msgIds) = getMailBodies charId msgIds |> Async.RunSynchronously
39 changes: 18 additions & 21 deletions EveLib/Interfaces.fs
Expand Up @@ -6,17 +6,16 @@ open EveLib
// http://community.eveonline.com/community/toolkit.asp

type ICharQueries =
abstract member GetAccountBalance : int -> Async<WalletSet>
abstract member GetMailHeaders : int -> Async<seq<MailHeader>>
//abstract member GetMailBodies : seq<int> -> Async<seq<MailBody>>
//abstract member GetMailBody : int -> Async<MailBody>
abstract member GetAccountBalance : charId:int -> Async<WalletSet>
abstract member GetMailHeaders : charId:int -> Async<seq<MailHeader>>
abstract member GetMailBodies : charId:int * [<ParamArray>] messageIds:int[] -> Async<seq<MailBody>>

type ICorpQueries =
abstract member GetAccountBalance : int -> Async<WalletSet>
abstract member GetAccountBalance : corpId:int -> Async<WalletSet>

type IEveQueries =
abstract member GetItemIds : [<ParamArray>] names : string[] -> Async<seq<NamedItem>>
abstract member GetItemNames : [<ParamArray>] ids : int[] -> Async<seq<NamedItem>>
abstract member GetItemIds : [<ParamArray>] names:string[] -> Async<seq<NamedItem>>
abstract member GetItemNames : [<ParamArray>] ids:int[] -> Async<seq<NamedItem>>

type IMapQueries =
abstract member GetRecentKills : unit -> Async<seq<SolarSystemKills>>
Expand All @@ -35,17 +34,16 @@ open System.Threading.Tasks
open EveLib

type ICharQueries =
abstract member GetAccountBalance : int -> Task<WalletSet>
abstract member GetMailHeaders : int -> Task<seq<MailHeader>>
//abstract member GetMailBodies : seq<int> -> Task<seq<MailBody>>
//abstract member GetMailBody : int -> Task<MailBody>
abstract member GetAccountBalance : charId:int -> Task<WalletSet>
abstract member GetMailHeaders : charId:int -> Task<seq<MailHeader>>
abstract member GetMailBodies : charId:int * [<ParamArray>] messageIds:int[] -> Task<seq<MailBody>>

type ICorpQueries =
abstract member GetAccountBalance : int -> Task<WalletSet>
abstract member GetAccountBalance : corpId:int -> Task<WalletSet>

type IEveQueries =
abstract member GetItemIds : [<ParamArray>] names : string[] -> Task<seq<NamedItem>>
abstract member GetItemNames : [<ParamArray>] ids : int[] -> Task<seq<NamedItem>>
abstract member GetItemIds : [<ParamArray>] names:string[] -> Task<seq<NamedItem>>
abstract member GetItemNames : [<ParamArray>] ids:int[] -> Task<seq<NamedItem>>

type IMapQueries =
abstract member GetRecentKills : unit -> Task<seq<SolarSystemKills>>
Expand All @@ -63,17 +61,16 @@ open System
open EveLib

type ICharQueries =
abstract member GetAccountBalance : int -> WalletSet
abstract member GetMailHeaders : int -> seq<MailHeader>
//abstract member GetMailBodies : seq<int> -> seq<MailBody>
//abstract member GetMailBody : int -> MailBody
abstract member GetAccountBalance : charId:int -> WalletSet
abstract member GetMailHeaders : charId:int -> seq<MailHeader>
abstract member GetMailBodies : charId:int * [<ParamArray>] messageIds:int[] -> seq<MailBody>

type ICorpQueries =
abstract member GetAccountBalance : int -> WalletSet
abstract member GetAccountBalance : corpId:int -> WalletSet

type IEveQueries =
abstract member GetItemIds : [<ParamArray>] names : string[] -> seq<NamedItem>
abstract member GetItemNames : [<ParamArray>] ids : int[] -> seq<NamedItem>
abstract member GetItemIds : [<ParamArray>] names:string[] -> seq<NamedItem>
abstract member GetItemNames : [<ParamArray>] ids:int[] -> seq<NamedItem>

type IMapQueries =
abstract member GetRecentKills : unit -> seq<SolarSystemKills>
Expand Down
1 change: 1 addition & 0 deletions EveLib/Models.fs
Expand Up @@ -81,6 +81,7 @@ type MailHeader = {

type MailBody = {
mutable Id : int
RecipientId : int
Text : string
QueryTime : DateTimeOffset
CachedUntil : DateTimeOffset
Expand Down

0 comments on commit c92573e

Please sign in to comment.